Spring安全:拒绝访问特定角色

时间:2018-04-23 10:07:48

标签: spring spring-security roles

我使用Spring编写了一组休息Web服务,但是无法使用Spring安全性为某些逻辑配置它。 我有这些类型的资源:

  • 无需经过身份验证即可访问的资源
  • 仅限某些角色可访问的资源
  • 某些角色无法访问的资源

我对上一个要求有疑问。我尝试过以下方法:

        http
        .authorizeRequests()  
            .antMatchers("/resource1").permitAll()                
            .antMatchers(HttpMethod.GET, "/resource2").hasAnyAuthority("ROLE_USER", "ROLE_ADMIN")
            .antMatchers(HttpMethod.GET, "/resource3").hasAuthority("ROLE_ADMIN")
            .antMatchers(HttpMethod.GET, "/resource4").not().hasAuthority("ROLE_USER")
            .anyRequest().fullyAuthenticated()
            .and().requestCache().requestCache(new NullRequestCache())
            .and().httpBasic().authenticationEntryPoint(authenticationEntryPoint)
            .and().csrf().disable();

此代码与我需要的代码最相似:

  • 每个人都可以访问“resource1”甚至是未经过身份验证的用户
  • 只有角色USER和ADMIN才能访问resource2
  • 只有ADMIN可以访问resource3

但问题是“resource4”...如果用户经过身份验证,一切正常(只有没有任何角色的用户才能访问该资源)...问题是Spring允许访问非认证用户(因为我认为它认为它们不属于USER规则,这是正确的)

如何将资源配置为某些角色无法访问,但是必须进行身份验证?

1 个答案:

答案 0 :(得分:1)

您可以使用.access(String expression)它允许指定URL由任意表达式保护

表达式= "不是(hasRole(' USER'))和isAuthenticated()"

导致

http
    .authorizeRequests()  
        .antMatchers("/resource1").permitAll()                
        .antMatchers(HttpMethod.GET, "/resource2").hasAnyAuthority("ROLE_USER", "ROLE_ADMIN")
        .antMatchers(HttpMethod.GET, "/resource3").hasAuthority("ROLE_ADMIN")
        .antMatchers(HttpMethod.GET,"/resource4").access("not( hasRole('USER') ) and isAuthenticated()")