spring security intercept url role

时间:2012-08-20 09:22:05

标签: spring spring-mvc spring-security

在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

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

2 个答案:

答案 0 :(得分:2)

这是正确的写作方式:

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

您可以查看official reference manual chapter about annonymous authentication您将看到以下配置的位置:

<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的理解有点不对,请在this answer by Luke Taylor, one of Spring Security's devs中详细了解它们。

答案 1 :(得分:2)

如果我没记错的话:不,在您的情况下,经过身份验证的用户不应该访问仅使用access =“ROLE_ANONYMOUS”保护的资源。您必须明确告诉spring允许具有“ROLE_USER”的用户访问它。 根据您使用的版本,您可以考虑使用expression-based access control。通过这种方式,您可以通过使用以下方式使每个人都可以访问资源:access =“permitAll()”恕我直言。