Security自定义认证规则
一、自动配置分析
boot对security自动配置源于SpringBootWebSecurityConfiguration类
@Configuration(proxyBeanMethods = false)
@ConditionalOnDefaultWebSecurity
@ConditionalOnWebApplication(type = Type.SERVLET)
class SpringBootWebSecurityConfiguration {@Bean@Order(SecurityProperties.BASIC_AUTH_ORDER)SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {//对所有http请求需要认证才能访问 ,支持表单认证和basic认证 ,这就是为什么引入依赖就对所有的资源进行包含 http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();return http.build();}
}
这个类什么时候才生效,进入注解ConditionalOnDefaultWebSecurity
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(DefaultWebSecurityCondition.class)
public @interface ConditionalOnDefaultWebSecurity {}进入注解DefaultWebSecurityCondition满足下面两种情况则默认配置会生效,
1、有SecurityFilterChain类(只要引入security就有)
2、没有WebSecurityConfigurerAdapter类实列和SecurityFilterChain类实列class DefaultWebSecurityCondition extends AllNestedConditions {DefaultWebSecurityCondition() {super(ConfigurationPhase.REGISTER_BEAN);}@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })static class Classes {}//可以通过覆盖WebSecurityConfigurerAdapter和SecurityFilterChain对security配置进行扩展,一般用WebSecurityConfigurerAdapter,如果改SecurityFilterChain就用覆盖SecurityFilterChain@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })static class Beans {}
}
分析默认配置类SpringBootWebSecurityConfiguration,满足下面两种情况则默认配置会生效,
- 有SecurityFilterChain类(只要引入security就有)
- 没有WebSecurityConfigurerAdapter类实列和SecurityFilterChain类实列
所以要修改security默认配置,我们只需要自定义一个类继承WebSecurityConfigurerAdapter即可
二、修改默认配置
1、前端后不分离
@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()//=================资源拦截=============.mvcMatchers("/user/login").permitAll()//permitAll()表示放行资源 无需认证就可访问 必须放在所有认证前.anyRequest().authenticated()//anyRequest()所有请求 .authenticated()表示所有请求需要认证才能访问.and().formLogin() //formLogin()表示表单认证//=================登录界面配置=================.loginPage("/user/toLoginPage")//自定义访问登录页面地址.loginProcessingUrl("/doLogin")//自定义登录请求的url.usernameParameter("name")//自定义用户名、密码变量名.passwordParameter("pass")//=================认证配置=================.successForwardUrl("/index")//认证成功始终跳转的路径.defaultSuccessUrl("/hello") redirect 重定向跳转 但是优先跳转到请求的路径 ,可以传入第二个参数true总是重定向到hello.failureForwardUrl("/user/toLoginPage")//认证失败 跳转 错误信息在request中,.failureUrl("/login.html")认证失败 redirect跳转 错误信息在session中//=================注销相关配置==========================.and().logout()//开启注销,默认是配置的
/*满足任意一个就行(AndRequestMatcher同时满足) 可以是get也可以是post.logoutRequestMatcher(new OrRequestMatcher(new AntPathRequestMatcher("/logout1","GET"),new AntPathRequestMatcher("/logout","POST")))*/.logoutUrl("/user/logout")//注销地址,默认是logout 并且请求方式只能是get.invalidateHttpSession(true)//清除session信息,默认true.clearAuthentication(true)//清除认证信息,默认true.logoutSuccessUrl("/user/toLoginPage")//退出,默认是登录页面地址.and().csrf().disable();}
}
2、前后端分离配置
配置
@Configuration
public class MySecurityConfig1 extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()//=================资源拦截=============.mvcMatchers("/user/login").permitAll().anyRequest().authenticated().and().formLogin()//=================登录认证=================.loginProcessingUrl("/doLogin").usernameParameter("name").passwordParameter("pass").successHandler(new MyAuthenticationSuccessHandler())//登录成功 自定义逻辑处理.failureHandler(new MFailureHandler())//登录失败 自定义逻辑处理//=================注销相关配置==========================.and().logout().logoutUrl("/user/logout").logoutSuccessHandler(new MyLogoutSuccessUrl())//自定义注销成功处理器.and().csrf().disable();}
}
定义登录成功的逻辑处理器
/*** 定义登录成功的逻辑处理器*/
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {Map<String,Object> map = new HashMap<>();map.put("code","200");map.put("msg","success");//认证信息map.put("authentication",authentication);response.setContentType("application/json;charset=UTF-8");response.getWriter().write(JSON.toJSONString(map));}
}
自定登录失败处理器
/*** 自定义认证失败处理器*/
public class MFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {Map<String,Object> map = new HashMap<>();map.put("code","500");map.put("msg","success");//认证信息map.put("exception",exception);response.setContentType("application/json;charset=UTF-8");response.getWriter().write(JSON.toJSONString(map));}
}
自定义注销处理器
/*** 自定义注销成功后逻辑处理*/
public class MyLogoutSuccessUrl implements LogoutSuccessHandler {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {Map<String,Object> map = new HashMap<>();map.put("code","200");map.put("msg","success");//认证信息map.put("authentication",authentication);response.setContentType("application/json;charset=UTF-8");response.getWriter().write(JSON.toJSONString(map));}
}
Security自定义认证规则相关推荐
- spring security 自定义认证登录
spring security 自定义认证登录 1.概要 1.1.简介 spring security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,以此来管理权限认证等. 1 ...
- spring security:自定义认证成功处理器
使用spring认证登录,登录之后,一般还需要进行其他处理,例如:保存登录时间.登录ip到数据库,缓存用户信息到redis数据库等等,这些操作可以通过自定义一个登录成功处理器来处理. 自定义认证成功处 ...
- Spring Security——自定义认证错误提示信息及自适应返回格式解决方案
解决方案 package com.hailiu.web.handler;import com.hailiu.model.Log; import com.hailiu.web.bean.Response ...
- SpringSecurity实战:基于mysql自定义SpringSecurity权限认证规则
上文<Spring Security 源码分析:Spring Security 授权过程>已经详细分析了Spring Security 授权过程,接下来通过上文的授权过程我们可以自定义授权 ...
- spring security自定义指南
序 本文主要研究一下几种自定义spring security的方式 主要方式 自定义UserDetailsService 自定义passwordEncoder 自定义filter 自定义Authent ...
- 看清spring security 认证流程,自定义认证方式
一.文献参考 Spring Security认证与授权的原理(源码分析,超详细)_Zystem-CSDN博客_springsecurity认证原理 spring security为什么这么复杂? - ...
- 3.Spring Security 自定义用户认证
Spring Security自定义用户认证 自定义认证过程 自定义认证的过程需要实现Spring Security提供的UserDetailService接口,该接口只有一个抽象方法loadUser ...
- 自定义request_Spring Security 自定义登录认证(二)
一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...
- 项目1在线交流平台-7.构建安全高效的企业服务-2.使用Security自定义社区网页认证与授权
文章目录 功能需求 一. 废弃登录检查的拦截器 二.授权配置 1. 导包 2. Security配置 2.1 `WebSecurity` 2.2`HttpSecurity` ` http.author ...
最新文章
- 关于一些Linux SVN的安装使用
- 双十一,假如有人把支付宝存储服务器炸了,你的钱是不是都没了?
- php链接数据库地址填写ip地址,PHP使用IP地址联接MySQL数据库
- Android的init过程:init.rc解析流程
- ML numpy、pandas、matplotlib的使用
- 视达配色教程17 灰色的色彩意象是什么
- win10java配置环境变量msi_Windows10+eclipse+hadoop2.7.1环境配置+wordcount-折腾笔记
- Odoo 14 版本优化更新的新功能体验
- pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=”files.pythonhosted.org“,
- UiModeManager设置夜间模式和行车模式
- 小米随身WIFI去掉云U盘的方法
- nema gps数据转换 matlab,NEMA-0183(GPRMC GPGGA)详细解释(GPS模块输出数据的解释)
- Apache Ignite
- antv的产品笼统记录
- 聊聊大龄程序员的一条出路
- UEFI 双系统+双硬盘安装
- 【jzoj4826】【小澳的葫芦】【二分答案】
- SDUST 实验+ 作业
- VGA显示图像 详细总结
- HTTP协议个人总结