配置两个安全配置时出现未经授权的错误[重复]

Posted

技术标签:

【中文标题】配置两个安全配置时出现未经授权的错误[重复]【英文标题】:Unauthorized error while configuring two Security Configurations [duplicate] 【发布时间】:2021-08-12 22:57:30 【问题描述】:

我正在通过扩展WebSecurityConfigurerAdaptor 来使用两个安全配置,如下所示

@Configuration
@Order(100)
public class CustomerSecurityAppConfiguration extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth
                .inMemoryAuthentication()
                .withUser("user1")
                .password("nooppassword")
                .and()
                .withUser("user2")
                .password("nooppassword")
                
    


    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable();
        http.cors().disable();

        http
                .authorizeRequests()
                .antMatchers("/customers/**")
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .and()
                .httpBasic();
    


@Configuration
class EmployeeSecurityConfiguration extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth
                .inMemoryAuthentication()
                .withUser("admin")
                .password("nooppassword")
                .roles("USER", "ADMIN")
                .and()
                .withUser("user")
                .password("nooppassword")
                .roles("USER");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable();
        http.cors().disable();

        http
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/inventory/**")
                .hasAnyRole("USER", "ADMIN")
                .antMatchers(HttpMethod.POST, "/inventory/**")
                .hasRole("ADMIN")
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .and()
                .httpBasic();
    

这里的想法是有两个realms。一份给客户,一份给订单。当我发出 HTTP 请求时,我收到 /inventory/customers 端点的 200 OK 响应,用户配置为 CustomerSecurityConfiguration 并收到 401 错误,这两个用户配置为 EmployeeSecurityConfiguration 配置。我有两个用于inventorycustomers 的REST 端点以及GETPOST。 我哪里错了?

【问题讨论】:

你可以查看AuthenticationManagerBuilder build-up后面的spring实现源码,多个配置可能不会合并,可能会被覆盖。就像第二个加载的覆盖第一个一样。您是否在每个配置类中设置了断点?我猜EmployeeSecurityConfiguration 不起作用,因为它是在CustomerSecurityConfiguration 之前加载的 @Tiina 我能够弄清楚。两个安全过滤器链都必须配置为RequestMatcher,否则默认为Requestmatcherany。我们需要为不同的域创建单独的安全过滤器链。 【参考方案1】:

我必须像下面这样为 http 添加请求匹配器

    http
       .requestMatchers().antMatchers("/actuator/**")
       .and()
       .authorizeRequests()
       .anyRequest()
       .authenticated()
       .and()
       .formLogin()
       .and()
       .httpBasic();

       

【讨论】:

以上是关于配置两个安全配置时出现未经授权的错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 API 迁移到 .net Core 3 时出现 JWT 401 未经授权的错误

如何将 ResourceServer 添加到现有的 spring 安全配置

解决Jenkins权限配置错误,导致登录时出现没有Overall/read权限

密码更新时出现未经授权的错误

使用 laravel Sanctum 和 api 令牌身份验证获取用户时出现 401(未经授权)[重复]

QuickBlox 有时会在登录时出现未经授权的错误。为啥?