当前位置: 首页 > 知识库问答 >
问题:

hasRole()和denyAll()方法不限制对资源的访问

锺离飞尘
2023-03-14

我正在开发Spring Boot和Spring Security Web应用程序,授权和资源服务器启用。我已经定义了一组用户,为他们分配了角色,并试图实现对REST终结点的基于角色的访问。我能够实现对endpoint的基于令牌的访问,但不能限制对最终用户的访问,这将基于他们的角色。

我已经完成了两个endpoint:/rest/products/list/rest/products/add,并试图通过管理员角色的用户限制对/rest/products/addendpoint的访问。

我的websecurityConfigureAdapter如下所示:

@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应仅在管理员/adminPass用户具有admin角色时才可供该用户访问。但是,如果尝试使用user1/user1Pass访问它,它仍然是可访问的:

获取用户1邮递员屏幕的访问令牌

使用user1Postman屏幕访问ADMIN仅相关endpoint

此外,我在配置方法中添加了(出于测试目的)以下规则. antMatcher("/Products/list"). denyAll();这里表示任何用户都不应该访问/Products/list。但它仍然保持响应(提供正确的访问令牌)。

在这里的类似问题中,如何修复Spring Security中的角色?匹配者的顺序应该从更具体到更少。但在我的例子中,有两个匹配器,没有匹配器可以重叠它们。

我将Spring Boot与Spring Boot starter安全性插件版本2.5.2一起使用。

要使,还需要进行哪些配置。拥有角色(“管理员”)。denyAll()是否按预期工作?


共有1个答案

郁隐水
2023-03-14

最终,我们能够通过以下方式找到解决方案:

这里有一个ResourceServerConfigurerAdapter类的示例。从这一点和您的评论中,dur,我意识到我混淆了ResourceServerConfigurerAdapterWebSecurityConfigureAdapter,试图在WebSecurityConfigureAdapter中定义访问限制匹配器。我以以下方式更改了资源服务器配置:

方法是在WebSecurityConfigrerAdapter

 @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();
    }

}

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

 类似资料:
  • 在我们的体系结构指南中,我们应该只从域模型或存储库实现(在基础结构层)中实例化业务异常 同样,这不会编译,不存在。 有人有主意吗?

  • 我有这个博客资源,它有通常的CRUD方法。(索引,创建,存储,显示,编辑,更新,销毁)。 我的路线中有以下路线。php: 这是很好的索引,但我不知道如何路由显示方法?还是有别的办法?我不应该路由资源,而是应该单独路由每个URI,并将我想要限制的URI放在我的限制访问路由中? 干杯

  • 本文向大家介绍SpringMVC访问静态资源的方法,包括了SpringMVC访问静态资源的方法的使用技巧和注意事项,需要的朋友参考一下 在SpringMVC中常用的就是Controller与View。但是我们常常会需要访问静态资源,如html,js,css,image等。 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问。该肿么办呢? 在配置文件:

  • 我们有一个Web应用程序,它使用Azure AD对Office 365进行OAuth。我们正在尝试限制我们有权访问的资源。例如:身份验证用户有权访问Site e1、Site e2和Site e3。我们希望将我们的应用程序访问权限限制为只访问Site e1。有人知道这是否可能吗?我试图查看Office 365、Azure AD甚至Discovery API留档,但找不到任何有用的东西。

  • 问题内容: 我正在尝试设置用于访问智能卡的PKCS11提供程序。我在系统上安装了PKCS11库,并遵循了《Java PKCS#11参考指南》中的说明 。在参考中,他们只是创建一个实例,并将配置文件的名称传递给构造函数。当我尝试编译以下代码时 我收到以下错误。 访问限制:由于必需的库/usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/ext/sunpkcs11.jar受

  • 本文向大家介绍PHP实现限制IP访问的方法,包括了PHP实现限制IP访问的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现限制IP访问的方法。分享给大家供大家参考,具体如下: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP网络编程技巧总结》、《php正则表达式用法总结》、《php curl用法总结》、《PHP数组(Array)操作技巧大全》、《php字符串(str