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

时间:2016-04-13 12:21:04

标签: java angularjs spring spring-security spring-boot

在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();

    }

2 个答案:

答案 0 :(得分:3)

我想问题是Spring。您需要为hasAnyAuthority()更改hasAnyRole()。

答案 1 :(得分:0)

Spring 会在检查 ROLE_ 时自动添加前缀 hasAnyRole,而 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.