Spring Webflux安全允许除一个网址

时间:2018-06-10 18:47:25

标签: java spring spring-security spring-webflux

我想允许在特定控制器中定义的所有网址除外。

让我们说我的控制器使用基本网址公开3个网址/users

  1. " /"列出所有用户
  2. " / {ID}"按ID列出用户
  3. " /管理"获取用户的管理员级别详细信息。
  4. 我想允许访问除最后一个用户之外的任何用户的1和2个网址。

    我一直在做这样的事情

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange()
            .pathMatchers("/users/**")
            .permitAll()
            .pathMatchers("/users/admin")
            .hasRole("ADMIN")
            .anyExchange()
            .authenticated()
            .and()
            .httpBasic()
            .and()
            .formLogin();
        return http.build();
    }
    

    但它不起作用。我也尝试了反过来,即

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange()
            .pathMatchers("/users/admin")
            .hasRole("ADMIN")
            .anyExchange()
            .authenticated()
            .pathMatchers("/users/**")
            .permitAll()
            .and()
            .httpBasic()
            .and()
            .formLogin();
        return http.build();
    }
    

    这也无效,因为anyExchange()已经注册了pathMatcher,因此无法联系到firstlist = firstlist*2

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。 anyExchange()authenticated()导致了此问题。 anyExchange()不允许进一步添加任何路径匹配器,authenticated()使整个应用程序受到保护,导致每个URL提示进行身份验证。

删除这两个工作。

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange()
        .pathMatchers("/users/admin/**")
        .hasRole("ADMIN")
        .pathMatchers("/**").permitAll()
        .and().httpBasic();
    return http.build();
}