我想在Spring Boot应用程序中基于http谓词和url模式切换身份验证和授权方案,以下是我的用例的简化。
大多数/ mgmt / ...请求将根据基本身份验证进行授权。
某些/ mgmt / ...将是公开开放的,不需要身份验证。
任何先前未定义的路径,都应忽略/阻止。
我的计划是定义规则并按顺序评估它们。 对于本示例中使用的那些规则,将按顺序评估三个规则,将首先使用匹配项。
GET /mgmt/configuration/** -> Publicly open (anonymous)
ANY /mgmt/** -> ADMIN role user
ANY /** -> deny
我对public和admin的规则有疑问,特别是它们重叠(都以/ mgmt开头)。 如果我将public置于其自己的上下文路径(/ public)下,则以下代码有效-但我不想这样做(也无法控制这些模式)。
也许我需要按上下文路径而不是认证方案对配置程序进行分组。配置实际上不是此示例中的静态对象,而是来自其他模块(微服务)的配置,它们被组装在安全性库中,以尝试集中身份验证代码。
@EnableWebSecurity
public class MultiHttpSecurityConfig {
private static final String MGMT_PATTERN = "/mgmt/**";
private static final String PUBLIC_PATTERN = "/public/**";
@Configuration
@Order(1)
public static class PublicConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher(PUBLIC_PATTERN).authorizeRequests().anyRequest().permitAll();
}
}
@Configuration
@Order(2)
public static class AdminConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher(MGMT_PATTERN)
.authorizeRequests().anyRequest()
.hasRole("ADMIN")
.and()
.httpBasic()
.and().csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
/**
* Some operation.
*
* @return some value.
*/
@Bean
public UserDetailsService userDetailsService() {
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
UserDetails user = User.withUsername("user")
.password(encoder.encode("password"))
.roles("ADMIN").build();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(user);
return manager;
}
}
@Configuration
@Order(3)
public static class DenyConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**").authorizeRequests().anyRequest().denyAll();
}
}
}
答案 0 :(得分:0)
我更改了配置,并按url模式(而不是类型)将它们分组,这解决了我的不同配置相互重叠的问题。