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