您当前的位置: 首页 >  web安全

SpringSecurity(二)Web安全

发布时间:2022-03-10 14:20:52 ,浏览量:6

Web安全

在SpringSecurity中,认证、授权等功能都是基于过滤器来完成的。如下表:

过滤器 过滤器作用 是否默认加载
ChannelProcessingFilter 过滤请求协议,如HTTPS和HTTP
WebAsyncManagerIntegrationFilter 将WebAsyncManager与Spring Security上下文进行集成
SecurityContextPersistenceFilter 在处理请求之前,将安全信息加载导SecurityContextHolder中以方便后续使用。请求结束后,在移除SecurityContextHolder中的信息
HeaderWiterFilter 头信息加入到响应中
CorsFilter 处理跨域问题
CsrfFilter 处理CSRF攻击
LogoutFilter 处理注销登录
OAuth2AuthorizationRequestRedirectFilter 处理OAuth2认证重定向
Saml2WebSsoAuthenticationRequestFilter 处理SAML认证
X509AuthenticationFilter 处理X509认证
AbstractPreAuthenticatedProcessingFilter 处理预认证问题
CasAuthenticationFilter 处理CAS单点登录
OAuth2LoginAuthenticationFilter 处理OAuth2认证
Saml2WebSsoAuthenticationFilter 处理SAML认证
UsernamePasswordAuthenticationFilter 处理表单登录
OpenIDAuthenticationFilter 处理OpenID认证
DefaultLoginPageGeneratingFilter 配置默认登录页面
DefaultLogoutPageGeneratingFilter 配置默认注销页面
ConcurrentSessionFilter 处理Session有效期
DigestAuthenticationFilter 处理HTTP摘要认证
BearerTokenAuthenticationFilter 处理OAuth2认证时的Access Token
BasicAuthenticationFilter 处理HttpBasic登录
RequestCacheAwareFilter 处理请求换成
SecurityContextHolderAwareRequestFilter 包装原始请求
JaasApiIntegrationFilter 处理JAAS认证
RememberMeAuthenticationFilter 处理RememberMe登录
AnonymousAuthenticationFilter 配置匿名认证
OAuth2AuthorizationCodeGrantFilter 处理OAuth2认证中的授权码
SessionManagementFilter 处理Session并发问题
ExceptionTranslationFilter 处理异常认证/授权中的情况
FilterSecurityInterceptor 处理授权
SwitchUserFilter 处理账户切换

此处默认加载是指引入 Spring Security依赖之后,不用任何配置,就会自动加载的过滤器

我们所见到SpringSecurity提供的功能,都是通过这些过滤器来实现的,这些过滤器按照既定的优先级排列,最终行程一个过滤器链。我们也可以自定义过滤器,并通过@Order来调整自定义过滤器在过滤链中的位置。

需要注意的是,默认过滤器并不是直接放在Web项目的原生过滤器链中,而是通过一个FilterChainProxy来统一管理。SpringSecurity中的过滤链通过FilterChainProxy嵌入到Web项目的原生过滤器链中,如下:

在SpringSecurity中,这样的过滤器链不仅仅只有一个,可能会有多个,当存在多个过滤器链时,多个过滤器链之间要指定优先级,当请求到达后,会从FilterChainProxy进行分发,先和哪个过滤器链匹配上,就用哪个过滤器链进行处理。当系统中存在多个不同的认证体系时,那么使用多个过滤器链就是非常有效。

登录数据保存

如果不使用SpringSecurity这一类的安全管理框架,我们以往通常会将用户登录数据保存在Session中,事实上,SpringSecurity也是这么做的。但是,为了方便SpringSecurity在此基础上还做了一些改进,其中最主要的一个变化就是线程绑定。

当用户登录成功后。SpringSecurity会将登录成功的用户保存到SecurityContextHolder中,SpringSecurityContextHolder中的数据保存默认是通过ThreadLocal来实现的,使用ThreadLocal创建的变量只能被当前线程访问,不能被其他线程访问和修改,也就是用户数据和请求线程绑定在一起。当登录请求处理完毕后,SpringSecurity会将SecurityContextHolder中的数据拿出来保存到Session中,同时将SecurityContextHolder中的数据情况,以后每当请求来时,SpringSecurity就会先从Session中取出登录数据,保存到SpringContextHolder中,方便在该请求的后续处理过程中使用,同时在请求结束时将SecurityContextHolder中的数据拿出来保存到Session中,然后在清空SecurityContextHolder中的数据。

这一策略非常方便用户在Controller或者Service层获取当前登录用户数据,但是带来的另一个问题就算,在子线程中想要获取用户登录数据就比较麻烦。SpringSecurity对此也提供了响应的解决方案,如果我们使用@Async注解来开启异步任务的话,那么只需要添加如下配置,使用SpringSecurity提供的异步任务代理,就可以在异步任务中从SecurityContextHolder里获取当前登录的用户信息。

@Configuration public class ApplicationConfiguration extends AsyncConfigurerSupport { @Override public Executor getAsyncExecutor() { return new DelegatingSecurityContextExecutorService(Executors.newFixedThreadPool(5)) } } 
关注
打赏
查看更多评论

暂无认证

  • 6浏览

    0关注

    115983博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录