基于 ROLES 的 Spring 安全授权不起作用

Posted

技术标签:

【中文标题】基于 ROLES 的 Spring 安全授权不起作用【英文标题】:Spring security authorization based on ROLES not working 【发布时间】:2016-08-04 12:53:53 【问题描述】:

在 Spring boot / spring security / Angular JS 应用程序中..

我试图仅在用户具有指定角色时才允许以下页面。

.antMatchers("/1_reportingEntities/*.html").hasAnyRole(roles)

但即使没有为用户设置该角色,它也允许该页面。 我错过了什么?

Java 代码

    @Override
    protected void configure(HttpSecurity http) throws Exception 

        String roles [] = new String[] "ROLE_EDITOR", "ROLE_AUTHORISER" ;

        http.httpBasic()
                .and()
                .authorizeRequests()

                // Permit these resources
                .antMatchers("/login", "/4_security/login.html", "/bower_components/**", "/0_common/*.html", "/1_reportingEntities/*.js",
                        "/2_dataCollections/*.js", "/3_calendar/*.js", "/4_security/*.js", "/")
                .permitAll()
                // All other requests needs authentication
                .anyRequest().authenticated()

                // Allow only if has certain roles  
                .antMatchers("/1_reportingEntities/*.html").hasAnyRole(roles)

                .and()
                // CSRF protection
                .csrf().csrfTokenRepository(csrfTokenRepository()).and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);

        // Enable https
        http.requiresChannel().anyRequest().requiresSecure();

    

【问题讨论】:

我认为 spring 会自动为角色添加 ROLE_,尝试使用数组 "EDITOR", "AUTHORISER" 无论你是否在它前面加上 ROLE 都没关系,Spring 可以检测到。 试试把 antMatchers.hasAnyRole 放在 anyRequest.authenticated 之前,看看是否有效? 【参考方案1】:

我想问题出在 Spring 上。您需要将 hasAnyRole() 更改为 hasAnyAuthority()。

【讨论】:

非常感谢您的工作。如果验证失败,因为用户没有有效角色,知道如何显示错误消息/页面吗?【参考方案2】:

Spring 会在检查 hasAnyRole 时自动添加前缀 ROLE_,而 hasAnyAuthority 不会。

因此,在您的示例中,当您使用 hasAnyRole("ROLE_EDITOR", "ROLE_AUTHORISER" ) 时,Spring 将实际检查您的用户是否具有任一角色 "ROLE_ROLE_EDITOR", "ROLE_ROLE_AUTHORISER"

您可以使用hasAnyRole("EDITOR", "AUTHORISER"),这将检查您的用户是否已被授予"ROLE_EDITOR", "ROLE_AUTHORISER",或者您可以继续指定"ROLE_EDITOR", "ROLE_AUTHORISER" ,但使用hasAnyAuthority.

【讨论】:

以上是关于基于 ROLES 的 Spring 安全授权不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core WebApi Jwt 基于角色的授权不起作用

基于输入参数标准的 Spring 安全授权

Spring Boot/JPA - 数据行级授权

如何通过数据库的LDAP和基于角色的授权实现Spring安全?

我应该使用基于 Spring 安全角色的授权还是 Angular Route Guards 或两者兼而有之? [关闭]

Spring security jsp授权标签不起作用