仅使用 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 令牌请求的授权标头?