仅使用 Spring Security 自定义令牌无状态保护 REST 控制器,同时保持常规状态完整 Web 登录正常工作

Posted

技术标签:

【中文标题】仅使用 Spring Security 自定义令牌无状态保护 REST 控制器,同时保持常规状态完整 Web 登录正常工作【英文标题】:Securing only REST controller with Spring Security custom token stateless while keeping regular state full web login working 【发布时间】:2016-06-16 03:07:11 【问题描述】:

我查看了 OAuth 示例,对于我的场景来说,这看起来有点过头了。我有一个使用 Spring 安全性的 Web 应用程序,将用户和权限存储在数据库中。我只想用无状态令牌保护部分“/rest/”控制器。 JWT 看起来是一个不错的方法,但我找不到一个示例,它只过滤某些路径“/rest/”并使用无状态令牌保护它,同时保持其余路径是否通过状态完整会话保护完全安全。请发布一些示例,说明如何在路径“/rest/”之间建立分叉请求,并为“/rest/”使用无状态令牌安全性(JWT 或任何其他自定义令牌)并声明完整其他人“/others/**”的安全性?

【问题讨论】:

你使用基于xml还是基于Java的配置? 不,这是 Spring Boot 应用程序 【参考方案1】:

以下是如何使用表单登录保护 UI 控制器和使用 http 基本身份验证保护 REST 控制器的示例。该示例使用 Spring Boot 运行,并简化为以不同方式保护不同端点所需的配置。

我没有演示如何替换 http 基本身份验证的示例,但您可能会发现 this blog post 很有帮助。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter


    @Configuration
    @Order(1)
    public static class RestApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter 
        @Bean
        CorsFilter corsFilter() 
            CorsFilter filter = new CorsFilter();
            return filter;
        

        protected void configure(HttpSecurity http) throws Exception 
            http
            .addFilterBefore(corsFilter(), SessionManagementFilter.class)
            .csrf().disable()
            .antMatcher("/rest-api/v1/**").authorizeRequests().anyRequest().hasAnyRole("APIClient")
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .httpBasic();
        
    


    @Configuration
    @Order(2)
    public static class UILoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter
        @Bean
        CorsFilter corsFilter() 
            CorsFilter filter = new CorsFilter();
            return filter;
        

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
            .addFilterBefore(corsFilter(), SessionManagementFilter.class)
            .and()
            .authorizeRequests()
            .antMatchers("/other/**").access("hasRole('whatever goes here')")
            // ...
            .and()
            .formLogin().loginPage("/login")
            //...
            .sessionManagement().sessionFixation().newSession().maximumSessions(1)
            .sessionRegistry(sessionRegistry());
            

【讨论】:

谢谢!这非常适合为 Web 登录和无状态休息调用提供单独的安全设置,正如您所指出的,可以使用 JWT 或 Oauth 进行扩展,但我认为它解决了我的主要问题。

以上是关于仅使用 Spring Security 自定义令牌无状态保护 REST 控制器,同时保持常规状态完整 Web 登录正常工作的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 Spring Security 实现 google 登录和使用 jwt 令牌自定义登录?

Spring Security 和 OAuth2 生成具有自定义授权类型的令牌

如何使用带有 WebClient 的 spring-security-oauth2 自定义 OAuth2 令牌请求的授权标头?

Spring Security 自定义注销空指针异常

Spring Security 中仅使用自定义 UserDetailsS​​ervice 禁止 403 [重复]

如何在自定义 Spring security 3.0 身份验证中正确处理异常?