今天咱们要进一步的的学习如何自定义配置 Spring Security 咱们已经屡次提到了 WebSecurityConfigurerAdapter
,并且咱们知道 Spring Boot 中的自动配置其实是经过自动配置包下的 SecurityAutoConfiguration
总配置类上导入的 Spring Boot Web 安全配置类 SpringBootWebSecurityConfiguration
来配置的。因此咱们就拿它开刀。若是仍是一头雾水建议经过 https://felord.cn 查看 Spring Security 实战 。html
咱们使用咱们最擅长的 Ctrl + C
、Ctrl + V
抄源码中的 SpringBootWebSecurityConfiguration
,命名为咱们自定义的 CustomSpringBootWebSecurityConfiguration
:java
@Configuration @ConditionalOnClass(WebSecurityConfigurerAdapter.class) @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) public class CustomSpringBootWebSecurityConfiguration { @Configuration @Order(SecurityProperties.BASIC_AUTH_ORDER) static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { super.configure(auth); } @Override public void configure(WebSecurity web) throws Exception { super.configure(web); } @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); } } }
相信已经有人注意到了上面 DefaultConfigurerAdapter
中我覆写(@Override
)了三个方法,咱们通常会经过自定义配置这三个方法来自定义咱们的安全访问策略。web
void configure(AuthenticationManagerBuilder auth)
用来配置认证管理器AuthenticationManager
。说白了就是全部 UserDetails
相关的它都管,包含 PasswordEncoder
密码机。若是你不清楚能够经过 Spring Security 中的 UserDetail 进行了解。本文对 AuthenticationManager
不作具体分析讲解,后面会有专门的文章来说这个东西 。 可经过 Spring Security 实战系列 进行学习。spring
void configure(WebSecurity web)
用来配置 WebSecurity
。而 WebSecurity
是基于 Servlet Filter
用来配置 springSecurityFilterChain
。而 springSecurityFilterChain
又被委托给了 Spring Security 核心过滤器 Bean DelegatingFilterProxy
。 相关逻辑你能够在 WebSecurityConfiguration
中找到。咱们通常不会过多来自定义 WebSecurity
, 使用较多的使其ignoring()
方法用来忽略 Spring Security 对静态资源的控制。跨域
void configure(HttpSecurity http)
这个是咱们使用最多的,用来配置 HttpSecurity
。 HttpSecurity
用于构建一个安全过滤器链 SecurityFilterChain
。SecurityFilterChain
最终被注入核心过滤器 。 HttpSecurity
有许多咱们须要的配置。咱们能够经过它来进行自定义安全访问策略。因此咱们单独开一章来说解这个东西。缓存
HttpSecurity
是后面几篇文章的重点,咱们将实际操做它来实现一些实用功能。因此本文要着重介绍它。安全
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 中的默认配置。经过以上的配置,你的应用具有了一下的功能:session
form
表单进行登录(默认路径为/login
),也就是前几篇咱们见到的登陆页。CSRF
攻击、 XSS
攻击。HTTP Basic
认证HttpSecurity
使用了builder
的构建方式来灵活制定访问策略。最先基于 XML
标签对 HttpSecurity
进行配置。如今大部分使用 javaConfig
方式。经常使用的方法解读以下:app
方法 | 说明 |
---|---|
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() | 链接以上策略的链接器,用来组合安全策略。实际上就是"并且"的意思 |
到今天为止,咱们已经由浅入深学习了不少关于 Spring Security 的知识。已经具备开始自定义来实现一些实用的功能了,在后面的文章开始咱们将结合实际开发场景进行一些实战操做。敬请关注公众号:Felordcn
以第一时间获取相关教程。cors
关注公众号:Felordcn获取更多资讯