时间:2021-05-20
主要是重写attemptAuthentication方法
导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>相关配置和代码
application.properties配置密码
spring.security.user.name=admin
spring.security.user.password=123
创建自定义身份过滤类
写json登录之前先看一下源码,了解一下它是如何表单登录的
在idea连按下shift键,搜索UsernamePasswordAuthenticationFilter类
进入后再按Ctrl+F12可以查看该类的所有方法
进入方法
我们只需要在request.getParameter()那里重写一下不就可以实现json登陆
重写attemptAuthentication(HttpServletRequestrequest,HttpServletResponseresponse)方法
只需要复制父类的方法,多加一个判断json的方法。就能同时支持key-value形式可json形式的参数了
public class MyAuthenticationFilter extends UsernamePasswordAuthenticationFilter { @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { if(!request.getMethod().equals("POST")){ throw new AuthenticationServiceException("Authentication method not supported" + request.getMethod()); } //说明是以json的形式传递参数 if (request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) { String username = null; String password = null; //将传入的json数据转换成map再通过get("key")获得 try { Map<String,String> map =new ObjectMapper().readValue(request.getInputStream(), Map.class); username = map.get("username"); password = map.get("password"); } catch (IOException e) { e.printStackTrace(); } if (username == null) { } if (password == null) { } username = username.trim(); UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } return super.attemptAuthentication(request, response); }}创建SecurityConfig配置类
注:自定义的过滤类和security原来那个表单登陆过滤设置是分开的
体现在filter.setFilterProcessesUrl()和loginProcessingUrl
因此表单登陆和json登陆的,successHandler判断也要分开写,
一会下面有效果图也可以印证这一点
@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .loginProcessingUrl("/doLogin") .permitAll() .and() .csrf().disable(); //将自定义的过滤器加进来,第二参数表示加到usernamePasswordAuthenticationFilter所在的位置 http.addFilterAt(myAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } @Bean MyAuthenticationFilter myAuthenticationFilter() throws Exception{ MyAuthenticationFilter filter = new MyAuthenticationFilter(); filter.setAuthenticationManager(authenticationManagerBean()); return filter; }}创建Controller
@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello(){ return "hello security"; }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
spring-security里自带了oauth2,正好YIIU里也用到了spring-security做权限部分,那为何不直接集成上第三方登录呢?然后我开始了
这里使用的是spring-security和原生的jasigcas包来进行整合,为什么没有直接使用spring提供的spring-security-cas,后面
一、Security简介1、基础概念SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一
在本教程中,我们将研究标准Spring框架和SpringBoot之间的区别。我们将重点讨论Spring的模块,如MVC和Security,在核心Spring中使
这篇文章主要介绍了spring基于xml文件配置Bean过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考