spring security拦截url角色
Posted
技术标签:
【中文标题】spring security拦截url角色【英文标题】:spring security intercept url roles 【发布时间】:2012-08-15 15:10:13 【问题描述】:在 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"/>
它工作正常。但是在上面的情况下,它是这样的还是我做错了什么。
【问题讨论】:
【参考方案1】:这是正确的写法:
<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 中了解更多信息。
【讨论】:
【参考方案2】:如果我没记错的话:不,在您的情况下,经过身份验证的用户不应访问仅受 access="ROLE_ANONYMOUS" 保护的资源。您必须明确告诉 spring 允许具有“ROLE_USER”的用户访问它。 根据您使用的版本,也许您应该考虑使用expression-based access control。这样,您只需使用 : access="permitAll()" 恕我直言更简单,就可以让每个人都可以访问资源。
【讨论】:
以上是关于spring security拦截url角色的主要内容,如果未能解决你的问题,请参考以下文章
Grails Spring Security 验证多个 url 的访问
Spring Security应用开发(15)层次化角色体系
Spring Security 入门(1-9)Spring Security - 拦截 url