照例先拜读大佬文章
徐靖峰
Renky 有点gaygay的 Surprise!!!~~
Spring Security Configure1
Spring Security Config模块一共有三个,认证相关的AuthenticationManagerBuilder 、Web相关的WebSecurity和HttpSecurity。
AuthenticationManagerBuilder:
用来配置全局的认证相关的信息。AuthenticationProvider认证服务提供商,UserDetailsService用户详情查询服务。
WebSecurity
全局请求规则配置(比如说静态文件、注册页面),全局的HttpFirewall配置、是否Debug配置,全局SecurityFilterChain配置、privilegeEvaluator,expressionHandler、securityInterceptor。
HttpSecurity2
方法 | 说明 |
---|---|
openidLogin() | 用于基于 OpenId 的验证 |
headers() | 将安全标头添加到响应 |
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 验证 |
addFilterAt() | 在指定的Filter类的位置添加过滤器 |
2.核心配置
Web开发需要配置的类 需要实现WebSecurityConfigurerAdapter
@Configuration //启用自定义配置(需要扩展WebSecurityConfigurerAdapter)
@EnableWebSecurity//禁用Boot的默认Security配置
@EnableGlobalMethodSecurity(prePostEnabled = true)//启用Security注解
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//需要认证的请求配置
.authorizeRequests()
//任何匹配到“/”“/home” 全部可以访问
.antMatchers("/","/home").permitAll()
//用户需要有ADMIN角色才能访问/admin前缀的地址
.antMatchers("/admin/**").hasRole("ADMIN")
//用户需要同时有ADMIN角色和DBA角色才能访问/db前缀的地址
.antMathers("/db/**").access("hasRole('DBA') and hasRole('ADMIN')")
//除了以上的匹配到的地址 其它的所有地址都需要经过认证
.anyRequest().authenticated()
//想当于XML配置文件中结尾封闭符号
.and()
.formLogin()
//指定登陆界面地址
.loginPage("/login")
//指定登陆成功后的处理句柄
.successHandler(loginSuccessHolder)
//指定所有用户可以访问
.permitAll()
.and()
.logout()
//指定logout的地址
// .logoutUrl("/logout")
//指定登陆成功后跳转的地址
.logoutSuccessUrl("/home")
//退出失败的处理句柄
.addLogoutHandler(logoutHandler)
.permitAll();
//http.exceptionHandling();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
/**
* Security 5 在升级以后要对密码格式进行了变更
*/
// auth
// .inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
// .withUser("admin").password(new BCryptPasswordEncoder().encode("admin")).roles("USER");
//配置自定义的UserDetailsService 来实现自定义的获取用户
auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder())
.and()
.authenticationProvider(authenticationProvider);
}
}