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

时间:2016-03-03 00:58:21

标签: java spring rest spring-security jwt

我已经查看了OAuth示例,看起来对我的方案来说太过分了。我有一个使用Spring安全性的Web应用程序,用户和权限存储在数据库中。我想只保留部分" / rest / "具有无状态令牌的控制器。 JWT看起来是一种很好的方式,但是我找不到只过滤一些路径的例子" / rest / "并使用无状态令牌保护它,同时保持其余路径通过状态完全会话保护或根本不保护。请发布一些关于如何在路径之间建立分叉请求的示例" / rest / "或不使用无状态令牌安全性(JWT或任何其他自定义令牌)用于" / rest / "并声明其他人的完全安全" / others / **" ?

1 个答案:

答案 0 :(得分:1)

下面是如何使用表单登录来保护UI控制器以及使用http basic auth保护REST控制器的示例。该示例使用Spring Boot运行,并简化为以不同方式保护不同端点所需的配置。

我没有演示如何替换http basic auth的示例,但您可能会发现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());
        }    
}