一、自动配置分析

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自定义认证规则相关推荐

  1. spring security 自定义认证登录

    spring security 自定义认证登录 1.概要 1.1.简介 spring security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,以此来管理权限认证等. 1 ...

  2. spring security:自定义认证成功处理器

    使用spring认证登录,登录之后,一般还需要进行其他处理,例如:保存登录时间.登录ip到数据库,缓存用户信息到redis数据库等等,这些操作可以通过自定义一个登录成功处理器来处理. 自定义认证成功处 ...

  3. Spring Security——自定义认证错误提示信息及自适应返回格式解决方案

    解决方案 package com.hailiu.web.handler;import com.hailiu.model.Log; import com.hailiu.web.bean.Response ...

  4. SpringSecurity实战:基于mysql自定义SpringSecurity权限认证规则

    上文<Spring Security 源码分析:Spring Security 授权过程>已经详细分析了Spring Security 授权过程,接下来通过上文的授权过程我们可以自定义授权 ...

  5. spring security自定义指南

    序 本文主要研究一下几种自定义spring security的方式 主要方式 自定义UserDetailsService 自定义passwordEncoder 自定义filter 自定义Authent ...

  6. 看清spring security 认证流程,自定义认证方式

    一.文献参考 Spring Security认证与授权的原理(源码分析,超详细)_Zystem-CSDN博客_springsecurity认证原理 spring security为什么这么复杂? - ...

  7. 3.Spring Security 自定义用户认证

    Spring Security自定义用户认证 自定义认证过程 自定义认证的过程需要实现Spring Security提供的UserDetailService接口,该接口只有一个抽象方法loadUser ...

  8. 自定义request_Spring Security 自定义登录认证(二)

    一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...

  9. 项目1在线交流平台-7.构建安全高效的企业服务-2.使用Security自定义社区网页认证与授权

    文章目录 功能需求 一. 废弃登录检查的拦截器 二.授权配置 1. 导包 2. Security配置 2.1 `WebSecurity` 2.2`HttpSecurity` ` http.author ...

最新文章

  1. 关于一些Linux SVN的安装使用
  2. 双十一,假如有人把支付宝存储服务器炸了,你的钱是不是都没了?
  3. php链接数据库地址填写ip地址,PHP使用IP地址联接MySQL数据库
  4. Android的init过程:init.rc解析流程
  5. ML numpy、pandas、matplotlib的使用
  6. 视达配色教程17 灰色的色彩意象是什么
  7. win10java配置环境变量msi_Windows10+eclipse+hadoop2.7.1环境配置+wordcount-折腾笔记
  8. Odoo 14 版本优化更新的新功能体验
  9. pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=”files.pythonhosted.org“,
  10. UiModeManager设置夜间模式和行车模式
  11. 小米随身WIFI去掉云U盘的方法
  12. nema gps数据转换 matlab,NEMA-0183(GPRMC GPGGA)详细解释(GPS模块输出数据的解释)
  13. Apache Ignite
  14. antv的产品笼统记录
  15. 聊聊大龄程序员的一条出路
  16. UEFI 双系统+双硬盘安装
  17. 【jzoj4826】【小澳的葫芦】【二分答案】
  18. SDUST 实验+ 作业
  19. VGA显示图像 详细总结
  20. HTTP协议个人总结

热门文章

  1. 特色烤麦芽的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. npm安装模块或运行项目异常的解决办法
  3. MySQL与Postgres大不同 优步选择了前者
  4. 让一句话生成一张二维码图片
  5. 6S大气传输模型修改源码添加、自定义CASI传感器光谱响应
  6. 你懂黑客吗?黑客!=cracker
  7. Ansible 介绍与实战操作演示
  8. 【python初级】检测图片文件类型或字节流获得的图片类型
  9. Android应用程序权限管理
  10. Unity连接KBE云服务器:登录网关(baseapp)异常