注:Springsecurity版本是4.2.4.RELEASE。
在jsp中使用has('role')的方式可以看下我的这篇博客。
1、引入maven依赖
List-1.1
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
2、xml配置
List-2.1
<bean id="webInvocationFilter"
class="org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator">
<constructor-arg ref="filterSecurityInterceptor"/>
</bean>
<security:http entry-point-ref="xx" use-expressions="true">
...
</security:http>
如List-2.1所示,单独定义个DefaultWebInvocationPrivilegeEvaluator的bean就可以了,将interceptor作为构造函数的参数传给它,Springsecurity会自动加载它,需要注意的是这个webInvocationFilter要放在security配置的最前面,不然会失效,至于为什么,现在还没弄清楚。
3、jsp中使用标签
List-3.1
...
<body>
...
<sec:authorize url="/someUrl">
有权限的用户才能看到这段话。
</sec:authorize>
...
</body>
...
我选择使用url的方式而非has('role')的方式,理由:角色名称、个数很有可能会经常变动,如果我们以has('role')的方式将role写到了jsp中,那么后面我们修改角色时,很有可能要去修改jsp中的角色;相反,如果以url的方式,那么我们只需要修改数据库中url、role、用户间的关系,不需要去关注是否要修改jsp中的权限。
4、源码分析
如下图4.1所示,DefaultWebInvocationPrivilegeEvaluator的构造方法中需要AbstractSecurityInterceptor。
图4.1
来看isAllowed方法,如下List-4.1所示:
List-4.1
public boolean isAllowed(String contextPath, String uri, String method,
Authentication authentication) {
Assert.notNull(uri, "uri parameter is required");
FilterInvocation fi = new FilterInvocation(contextPath, uri, method);
Collection<ConfigAttribute> attrs = securityInterceptor
.obtainSecurityMetadataSource().getAttributes(fi);
if (attrs == null) {
if (securityInterceptor.isRejectPublicInvocations()) {
return false;
}
return true;
}
if (authentication == null) {
return false;
}
try {
securityInterceptor.getAccessDecisionManager().decide(authentication, fi,
attrs);
}
catch (AccessDeniedException unauthorized) {
if (logger.isDebugEnabled()) {
logger.debug(fi.toString() + " denied for " + authentication.toString(),
unauthorized);
}
return false;
}
return true;
}
- 首先用securityInterceptor的SecurityMetadataSource获取当前request对应的所有ConfigAttribute,即访问当前request中的url需要哪些权限。
- 之后用securityInterceptor的AccessDecisionManager来决定当前用户是否可以访问request中的url。
Reference
- Springsecurity-4.2.4.RELEASE源码
来源:oschina
链接:https://my.oschina.net/u/2518341/blog/2993748