Spring Security 在 Servlet 请求中实现鉴权
1. 前言
Servlet 是 Java Web 应用的最常见场景,Spring Security 对 Servlet 的权限认定过程实现了规范化和流程化。
本节主要讨论在 Servlet 应用中,如何通过 Spring Security 实现鉴权。
2. Servlet 权限控制的流程
Servlet 鉴权主要围绕着 FilterSecurityInterceptor 类展开,该类作为一个安全过滤器,被放置在 FilterChainProxy 中。

图 1. Servlet 请求鉴权流程
具体流程如下:
FilterSecurityInterceptor从SecurityContextHolder中获取Authentication对象;FilterSecurityInterceptor从HttpServletRequest、HttpServletREsponse、FilterChain中创建FilterInvocation对象;- 将创建的 
FilterInvocation对象传递给SecurityMetadataSource用来获取ConfigAttribute对象集合; - 最后,将 
Authentication、FilterInvocation和ConfigAttribute对象传递给AccessDecisionManager实例验证权限:- 如果验证失败,将抛出 
AccessDeniedException异常,并由ExceptionTranslationFilter接收并处理; - 如果验证通过,
FilterSecurityInterceptor将控制权交还给FilterChain,使程序继续执行。 
 - 如果验证失败,将抛出 
 
3. Servlet 权限控制的配置实现
默认情况下,Spring Security 的权限要求所有的请求都需要首先通过认证。相当于以下配置描述:
protected void configure(HttpSecurity http) throws Exception {
    http
        // ...
        .authorizeRequests(authorize -> authorize
            .anyRequest().authenticated()
        );
}
如果我们需要配置 Spring Security 对不同请求有不同的处理规则时,可通过以下方式修改配置:
protected void configure(HttpSecurity http) throws Exception {
    http
        // ...
        .authorizeRequests(authorize -> authorize                                  
            .mvcMatchers("/resources/**", "/signup", "/about").permitAll()         
            .mvcMatchers("/admin/**").hasRole("ADMIN")                             
            .mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")   
            .anyRequest().denyAll()                                                
        );
}
以上这段代码实现了如下功能:
- 指定了多种规则,每种规则按照其配置的顺序决定优先级;
 - 匹配了多个 URL 规则,对于 
/resources、/signup、/about允许任何用户访问; - 任何以 
/admin/开头的地址都要求用户具有管理员权限ROLE_ADMIN,其中ROLE_前缀是 Spring Security 默认添加的,用户无需做特殊处理; - 任何以 
/db/为开头的地址需要同时拥有ROLE_ADMIN和ROLE_DBA角色; - 没有被上述 URL 地址匹配的地址都将被禁止访问,加上这一条非常有助于提升系统的安全性。
 
4. 小结
本节讨论了如何用 Spring Security 规范化 Servlet 鉴权过程:
- Spring Security 对 Servlet 请求的权限控制,主要依赖于 
FilterSecurityInterceptor实现; - Spring Security 默认对每一个 Servlet 请求都要求用户已通过认证;
 - Spring Security 支持对 Servlet 的不同 URL 规则配置不同的权限规则。
 
下节我们讨论如何通过「访问控制表达式」实现多样化的鉴权规则。
          本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
