开头
Spring Security 是spring项目之中的一个安全模块,选择Spring Security来保护web应用是一个非常好的选择。
核心类-过滤器
类名 | 用途 |
---|---|
过滤器-WebAsyncManagerIntegrationFilter | 用来处理异步请求的安全上下文 |
过滤器-SecurityContextPersistenceFilter | 控制 SecurityContext 的在一次请求中的生命周期 |
过滤器-HeaderWriterFilter | 给 http 响应添加一些 Header,比如 X-Frame-Options |
过滤器-CsrfFilter | 用于防止csrf攻击 |
过滤器-LogoutFilter | 用户登出过滤器 |
过滤器-UsernamePasswordAuthenticationFilter | 用于处理基于表单的登录请求,从表单中获取用户名和密码。 |
过滤器-ChannelProcessingFilter | 过滤哪些请求必须用 https 协议, 哪些请求必须用 http 协议 |
过滤器-ConcurrentSessionFilter | 断session是否过期以及更新最新的访问时间 |
过滤器-OAuth2AuthorizationRequestRedirectFilter | 处理 OAuth2 请求 |
过滤器-Saml2WebSsoAuthenticationRequestFilter | 基于 SMAL 的 SSO 单点登录请求认证过滤器 |
过滤器-X509AuthenticationFilter | X509 认证过滤器。你可以通过 HttpSecurity#X509() 来启用和配置相关功能 |
过滤器-AbstractPreAuthenticatedProcessingFilter | 处理经过预先认证的身份验证请求的过滤器的基类 |
BasicAuthenticationFilter | |
RequestCacheAwareFilter | |
SecurityContextHolderAwareRequestFilter | |
AnonymousAuthenticationFilter | |
SessionManagementFilter | |
ExceptionTranslationFilter | |
FilterSecurityInterceptor | |
RememberMeAuthenticationFilter |
核心类-认证
类名 | 用途 |
---|---|
AbstractUserDetailsAuthenticationProvider | 用户认证Provider |
AuthenticationManager | |
ProviderManager | |
AuthenticationManager | |
UserDetailsService | 自定义用户类要实现该接口 |
InMemoryUserDetailsManager | 将用户数据源寄存在内存里 |
DaoAuthenticationProvider | JDBC数据库型认证Provider |
GrantedAuthority | 自定义权限需要实现该接口 |
HttpSecurity | |
AccessDecisionManager | 授权管理器 ,有:一票决定,一票否定,少数服从多数 |
GrantedAuthority | |
UsernamePasswordAuthenticationToken | 用户、密码Token认证 |
PasswordEncoder | |
StandardPasswordEncoder | |
BCryptPasswordEncoder |
Spring Security 流程
部分类解读
1、HttpSecurity
HttpSecurity提供了很多配置相关的方法,例如, authorizeRequests()、formLogin()、httpBasic()和 csrf()。
authorizeRequests()方法实际上返回了一个URL 拦截注册器,我们可以调用它提供的anyanyRequest()、antMatchers()和regexMatchers()等方法来匹配系统的URL,并为其指定安全策略。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/css/**").permitAll()
.anyRequest().authenticated() //任何请求,登录后可以访问
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.failureUrl("/login?error")
.permitAll() //登录页面用户任意访问
.and()
.logout().permitAll(); //注销行为任意访问
http.addFilterBefore(myFilterSecurityInterceptor, FilterSecurityInterceptor.class);
}
表单登录配置模块提供了 successHandler()和 failureHandler()两个方法,分别处理登录成功和 登录失败的逻辑。
路由,角色权限控制:
http.authorizeRequests()
.antMatchers("/admin/api/**").hasRole("ADMIN")
.antMatchers("/user/api/**").hasRole("USER")
.antMatchers("/app/api/**").permitAll()
.anyRequest().authenticated().and()
基于内存用户认证
@Bean
public UserDetailsService userDetailsService()(
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("user").password("123").roles("USER").b uild());
manager.createUser(User.withUsername("admin").password("123").roles("USER", "ADMIN").build());
return manager;