主要是重写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判断也要分开写,
一会下面有效果图也可以印证这一点
@Configuration public 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
@RestController public class HelloController { @GetMapping("/hello") public String hello(){ return "hello security"; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍基于spring security实现登录注销功能过程解析,包括了基于spring security实现登录注销功能过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了基于spring security实现登录注销功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1、引入maven依赖 2、Security
本文向大家介绍基于JWT实现SSO单点登录流程图解,包括了基于JWT实现SSO单点登录流程图解的使用技巧和注意事项,需要的朋友参考一下 一、基于JWT实现SSO单点登录原理 1、什么是单点登录 所谓单点登录就是有多个应用部署在不同的服务器上,只需登录一次就可以互相访问不同服务器上的资源。 2、单点登录流程 当一个访问请求发给应用A,如果这个请求需要登录以后才能访问,那么应用A就
本文向大家介绍基于springboot实现整合shiro实现登录认证以及授权过程解析,包括了基于springboot实现整合shiro实现登录认证以及授权过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了基于springboot实现整合shiro实现登录认证以及授权过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.添加
本文向大家介绍基于PHP实现用户登录注册功能的详细教程,包括了基于PHP实现用户登录注册功能的详细教程的使用技巧和注意事项,需要的朋友参考一下 教程前先给大家看看小编的实现成果吧! 图1: 图2: 图3: 教程: 实现这个功能我们需要五个php文件: login.php (登录界面,如图2) loginaction.php (使login.php实现与数据库的连接,并校正输入) loginsucc
本文向大家介绍基于vue+element实现全局loading过程详解,包括了基于vue+element实现全局loading过程详解的使用技巧和注意事项,需要的朋友参考一下 项目中使用的是vue+element实现的全局loading 1.引入所需组件,这里主要就是router和element组件,element组件引入可以参考element官网 2.下面就是重点及代码实现了 首先是全局的一个变
本文向大家介绍Java Web基于Session的登录实现方法,包括了Java Web基于Session的登录实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java Web基于Session的登录实现方法。分享给大家供大家参考,具体如下: 希望本文所述对大家Java web程序设计有所帮助。