hasrole()和denyall()方法不限制对资源的访问

5ssjco0h  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(323)

我正在开发启用了授权和资源服务器的SpringBoot和SpringSecurityWeb应用程序。我已经定义了一组用户,为他们分配了角色,并试图实现对rest端点的基于角色的访问。我能够实现对端点的基于令牌的访问,但不能限制对最终用户的访问,这将取决于他们的角色。
我已经完成了两个端点: /rest/products/list/rest/products/add 并试图限制访问 /rest/products/add 与属于的用户的终结点 ADMIN 角色
我的 WebSecurityConfigurerAdapter 详情如下:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .passwordEncoder(passwordEncoder)
                .withUser("user1")
                    .password(passwordEncoder.encode("user1Pass"))
                    .roles("USER")
                    .and()
                .withUser("user2")
                    .password(passwordEncoder.encode("user2Pass"))
                    .roles("USER")
                    .and()
                .withUser("admin")
                    .password(passwordEncoder.encode("adminPass"))
                    .roles("ADMIN");
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {

        http
            .authorizeRequests()
                .antMatchers("/rest/products/add").hasAnyRole("ADMIN")
                .antMatchers("/rest/products/list").denyAll();
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

因此,资源 /rest/products/add 应仅在admin/adminpass用户有权限的情况下才可访问该用户 ADMIN 角色但是,如果尝试使用user1/user1pass访问它,它仍然是可访问的:
获取user1 Postman 屏幕的访问令牌

访问 ADMIN 仅与 user1 Postman 屏幕

我还在配置方法中添加了(出于测试目的)以下规则 .antMatchers("/products/list").denyAll(); 这里表明 /products/list 任何用户都不能访问。但它仍然保持响应(提供正确的访问令牌)。
在这里的类似问题中,如何修复spring security中的角色?匹配者的顺序应该从更具体到更少。但在我的例子中,有两个匹配器,没有匹配器可以重叠它们。
我用的是Spring Boot spring-boot-starter-security 插件版本2.5.2。
应进行哪些额外的配置以使 .hasRole("ADMIN").denyAll() 按预期工作?

jw5wzhpr

jw5wzhpr1#

最终,我们能够通过以下方式找到解决方案:
这里有一个例子 ResourceServerConfigurerAdapter 班级。从这个和你的评论中,杜尔,我意识到我很困惑 ResourceServerConfigurerAdapterWebSecurityConfigurerAdapter ,正在尝试在中定义访问限制匹配器 WebSecurityConfigurerAdapter . 我以以下方式更改了资源服务器配置:
方法是在 WebSecurityConfigurerAdapter ```
@Override
public void configure(final HttpSecurity http) throws Exception {

    http.authorizeRequests()
            .antMatchers("/rest/products/add").hasAnyRole("ADMIN")
            .antMatchers("/rest/products/list").denyAll();
}
被转移到

@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

@Override
public void configure(final HttpSecurity http) throws Exception {

    http.authorizeRequests()
            .antMatchers("/rest/products/add").hasAnyRole("ADMIN")
            .antMatchers("/rest/products/list").denyAll();
}

}

现在,上面匹配器定义的限制正在按预期工作。

相关问题