2

在 spring security intercept-url 配置中,如果我为特定路径定义了特定角色,比如 ROLE_USER,则只有当用户具有该权限时,该路径才应该可以访问。这是有道理的,但是如果我将角色设置为 ROLE_ANONYMOUS,<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS"/>即使用户经过身份验证,它是否也可以访问,比如当用户拥有 ROLE_USER 权限时?但这不会发生。

这是日志

Checking match of request : '/resources/js/test.js'; against '/resources/**'
Secure object: FilterInvocation: URL: /resources/js/test.js; Attributes: [ROLE_ANONYMOUS]
Previously Authenticated:   org.springframework.security.authentication.UsernamePasswordAuthenticationToken***********************************************
Voter: org.springframework.security.access.vote.RoleVoter@1712310, returned: -1

然后我得到一个拒绝访问异常。我知道如果我添加<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS,ROLE_USER"/>我的 Http 配置它工作正常。但在上述情况下,是这样的还是我做错了什么。

4

2 回答 2

2

正确的写法是:

<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS,ROLE_USER"/>

您可以查看有关匿名身份验证的官方参考手册章节,您将在其中看到以下配置:

<bean id="filterSecurityInterceptor"
    class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
  <property name="securityMetadata">
    <security:filter-security-metadata-source>
      <security:intercept-url pattern='/index.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/hello.htm' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/logoff.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/login.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/**' access='ROLE_USER'/>
    </security:filter-security-metadata-source>" +
  </property>
</bean>

您对 ROLE_ANONYMOUS 和 ROLE_USER 的理解有点错误,请在Spring Security 的开发人员之一 Luke Taylor 的这个答案中阅读更多关于它们的信息。

于 2012-08-20T11:55:02.790 回答
2

如果我没记错的话:不,在您的情况下,经过身份验证的用户不应访问仅受 access="ROLE_ANONYMOUS" 保护的资源。您必须明确告诉 spring 允许具有“ROLE_USER”的用户访问它。根据您使用的版本,也许您应该考虑使用基于表达式的访问控制。这样,您只需使用 : access="permitAll()" 就可以让每个人都可以访问资源,恕我直言,这更简单。

于 2012-08-20T12:07:31.100 回答