Spring Security 进阶干货:自定义配置类入口WebSecurityConfigurerAdapter
1. 前言
今天我们要进一步的的学习如何自定义配置 Spring Security 我们已经多次提到了 WebSecurityConfigurerAdapter
,而且我们知道 Spring Boot 中的自动配置实际上是通过自动配置包下的 SecurityAutoConfiguration
总配置类上导入的 Spring Boot Web 安全配置类 SpringBootWebSecurityConfiguration
来配置的。所以我们就拿它开刀。
2. 自定义 Spring Boot Web 安全配置类
我们使用我们最擅长的 Ctrl + C
、Ctrl + V
抄源码中的 SpringBootWebSecurityConfiguration
,命名为我们自定义的 CustomSpringBootWebSecurityConfiguration
:
@Configuration@ConditionalOnClass(WebSecurityConfigurerAdapter.class)@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)public class CustomSpringBootWebSecurityConfiguration {@Configuration@Order(SecurityProperties.BASIC_AUTH_ORDER)static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {super.configure(auth);}@Overridepublic void configure(WebSecurity web) throws Exception {super.configure(web);}@Overrideprotected void configure(HttpSecurity http) throws Exception {super.configure(http);}}}
相信已经有人注意到了上面 DefaultConfigurerAdapter
中我覆写(@Override
)了三个方法,我们一般会通过自定义配置这三个方法来自定义我们的安全访问策略。
2.1 认证管理器配置方法
void configure(AuthenticationManagerBuilder auth)
用来配置认证管理器AuthenticationManager
。说白了就是所有 UserDetails
相关的它都管,包含 PasswordEncoder
密码机。本文对 AuthenticationManager
不做具体分析讲解,后面会有专门的文章来讲这个东西 。
2.2 核心过滤器配置方法
void configure(WebSecurity web)
用来配置 WebSecurity
。而 WebSecurity
是基于 Servlet Filter
用来配置 springSecurityFilterChain
。而 springSecurityFilterChain
又被委托给了 Spring Security 核心过滤器 Bean DelegatingFilterProxy
。 相关逻辑你可以在 WebSecurityConfiguration
中找到。我们一般不会过多来自定义 WebSecurity
, 使用较多的使其ignoring()
方法用来忽略 Spring Security 对静态资源的控制。
2.3 安全过滤器链配置方法
void configure(HttpSecurity http)
这个是我们使用最多的,用来配置 HttpSecurity
。 HttpSecurity
用于构建一个安全过滤器链 SecurityFilterChain
。SecurityFilterChain
最终被注入核心过滤器 。 HttpSecurity
有许多我们需要的配置。我们可以通过它来进行自定义安全访问策略。所以我们单独开一章来讲解这个东西。
3. HttpSecurity 配置
HttpSecurity
是后面几篇文章的重点,我们将实际操作它来实现一些实用功能。所以本文要着重介绍它。
3.1 默认配置
protected void configure(HttpSecurity http) throws Exception {logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();}
上面是 Spring Security 在 Spring Boot 中的默认配置。通过以上的配置,你的应用具备了一下的功能:
- 所有的请求访问都需要被授权。
- 使用
form
表单进行登陆(默认路径为/login
),也就是前几篇我们见到的登录页。 - 防止
CSRF
攻击、XSS
攻击。 - 启用
HTTP Basic
认证
3.2 常用方法解读
HttpSecurity
使用了builder
的构建方式来灵活制定访问策略。最早基于 XML
标签对 HttpSecurity
进行配置。现在大部分使用 javaConfig
方式。常用的方法解读如下:
方法 | 说明 |
---|---|
openidLogin() | 用于基于 OpenId 的验证 |
headers() | 将安全标头添加到响应,比如说简单的 XSS 保护 |
cors() | 配置跨域资源共享( CORS ) |
sessionManagement() | 允许配置会话管理 |
portMapper() | 允许配置一个PortMapper(HttpSecurity#(getSharedObject(class))),其他提供SecurityConfigurer的对象使用 PortMapper 从 HTTP 重定向到 HTTPS 或者从 HTTPS 重定向到 HTTP。默认情况下,Spring Security使用一个PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443,HTTP 端口80到 HTTPS 端口443 |
jee() | 配置基于容器的预认证。 在这种情况下,认证由Servlet容器管理 |
x509() | 配置基于x509的认证 |
rememberMe | 允许配置“记住我”的验证 |
authorizeRequests() | 允许基于使用HttpServletRequest限制访问 |
requestCache() | 允许配置请求缓存 |
exceptionHandling() | 允许配置错误处理 |
securityContext() | 在HttpServletRequests之间的SecurityContextHolder上设置SecurityContext的管理。 当使用WebSecurityConfigurerAdapter时,这将自动应用 |
servletApi() | 将HttpServletRequest方法与在其上找到的值集成到SecurityContext中。 当使用WebSecurityConfigurerAdapter时,这将自动应用 |
csrf() | 添加 CSRF 支持,使用WebSecurityConfigurerAdapter时,默认启用 |
logout() | 添加退出登录支持。当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL”/ logout”,使HTTP Session无效来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到”/login?success” |
anonymous() | 允许配置匿名用户的表示方法。 当与WebSecurityConfigurerAdapter结合使用时,这将自动应用。 默认情况下,匿名用户将使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色 “ROLE_ANONYMOUS” |
formLogin() | 指定支持基于表单的身份验证。如果未指定FormLoginConfigurer#loginPage(String),则将生成默认登录页面 |
oauth2Login() | 根据外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份验证 |
requiresChannel() | 配置通道安全。为了使该配置有用,必须提供至少一个到所需信道的映射 |
httpBasic() | 配置 Http Basic 验证 |
addFilterBefore() | 在指定的Filter类之前添加过滤器 |
addFilterAt() | 在指定的Filter类的位置添加过滤器 |
addFilterAfter() | 在指定的Filter类的之后添加过滤器 |
and() | 连接以上策略的连接器,用来组合安全策略。实际上就是”而且”的意思 |
4. 总结
到今天为止,我们已经由浅入深学习了很多关于 Spring Security 的知识。已经具有开始自定义来实现一些实用的功能了,在后面的文章开始我们将结合实际开发场景进行一些实战操作。
Spring Security 进阶干货:自定义配置类入口WebSecurityConfigurerAdapter相关推荐
- Spring Security 实战干货:自定义配置类入口 WebSecurityConfigurerAdapter
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 今天我们要进一步的的学习如何自定义配置 Sp ...
- Spring Security 实战干货:玩转自定义登录
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 前面的关于 Spring Security ...
- Spring Security 实战:基于配置的接口角色访问控制
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...
- Spring Security 实战干货: RBAC权限控制概念的理解
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...
- Spring Security 实战:自定义异常处理
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 最近实在比较忙,很难抽出时间来继续更 [S ...
- Spring Security 实战干货:自定义异常处理
Spring Security 实战干货:自定义异常处理 转自:https://www.cnblogs.com/felordcn/p/12142514.html 文章目录 1. 前言 2. Sprin ...
- SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解
1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...
- Spring Security 实战干货:客户端OAuth2授权请求的入口在哪里
1. 前言 在Spring Security 实战干货:OAuth2 第三方授权初体验一文中我先对 OAuth2.0 涉及的一些常用概念进行介绍,然后直接通过一个 DEMO 来让大家切身感受了 OAu ...
- Spring Security 实战干货:实现自定义退出登录
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 上一篇对 Spring Security 所 ...
最新文章
- 服务器端口进程未响应,Tomcat正在运行,但8080端口未响应
- linux使用X11捕捉鼠标,如何在Linux下合法地以编程方式捕获第二个鼠标或轨迹球,X?...
- 清华大学参赛计算机集群,清华学生超算团队获得国际大学生超级计算机竞赛(SC18)总冠军...
- c语言fgetpos的参数,C语言fgetpos()函数:获得当前文件的读写指针(转)
- 天翼云从业认证(3.2)天翼云存储产品
- linux学习总结--linux100day(day1)
- .NET 应用程序支持直接调用 WebAssembly 模块
- java获取tomcat目录结构_tomcat目录结构简介_动力节点Java学院整理
- java一个界面用另一个界面的值_如何将参数/值从一个弹出窗口传递到Angular2中的另一个弹出窗口...
- http响应头中X-Frame-Options的作用及危害
- IDEA如何添加本地项目到git上
- 把数字随机分成 php,php随机数 微信随机生成红包金额算法php版
- MMIO与PIO区别
- html遮罩层动画制作,教你用Flash遮罩层制作漂亮的文字效果
- ChinaITLab-Linux工程师培训课程笔记6
- omnet++ tictoc2 实例分析
- 如何提高FPGA工作频率?影响FPGA运行速度的几大因素
- 【BZOJ4987】Tree 树形DP
- STM32学习心得十八:通用定时器基本原理及相关实验代码解读
- 杜兰特全部比赛录像合集【百度网盘高清分享】
热门文章
- CNS级别的插图你也可以实现,只需2天
- 扩增子图表解读7三元图:三组差异数量和关系
- 科研经验2:云协作建立实验室工作总结和内部资料共享平台
- R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend
- R语言使用str_order函数和str_sort函数对字符向量进行排序(str_order返回字符串排序的次序值(索引)、str_sort返回排序后的字符串)
- R语言ggplot2可视化指定图像标题(title)、副标题(subtitle)的内容、字体大小、字体类型、色彩、对齐方式等实战
- R语言可视化包ggplot2包绘制多个图形并将多个图像垂直堆叠c成一个图像实战(grid.arrange)
- 特征选择、特征选择方法
- 介绍一下K近邻(KNN)算法,KNeighbors和RadiusNeighbors的差异是什么?各有什么优势?
- 随机梯度下降、批量梯度下降、小批量梯度下降分类是什么?有什么区别?batch_size的选择如何实施、有什么影响?