注:Springsecurity的版本是4.2.4.RELEASE.
项目中有这样的需求,想让jsp页面的某些链接、按钮等只让高权限的用户看到,使用的是Springsecurity的jsp tag.
1、jsp页面
如下List-1.1所示,想要达到的效果是只有当用户有角色role2时才能看到"高权限的用户可见!"这段内容。
List-1.1
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<html>
<head>
<title>xxx</title>
</head>
<body>
<sec:authorize access="hasRole('role2')">
高权限的用户可见!
</sec:authorize>
.......
2、项目中要引入jsp tag的依赖
List-2.1
代码语言:javascript复制<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
3、xml配置
要设置expressionHandler,且将defaultRolePrefix设置为"",为什么呢?这要深入源码层。
List-3.1
代码语言:javascript复制<security:http entry-point-ref="xx" use-expressions="true">
...
<security:expression-handler ref="expressionHandler"/>
...
</security:http>
<bean id="expressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
<!--有意的设置为""-->
<property name="defaultRolePrefix" value=""/>
</bean>
...
DefaultWebSecurityExpressionHandler中,defaultRolePrefix的值是ROLE_,如果defaultRolePrefix的值不为null或者"",那么SecurityExpressionRoot的方法getRoleWithDefaultPrefix中,会把defaultRolePreix加上作为前缀来使用。
我就是不知道这点,所以弄了半天发现没有生效,后来进入源码才明白的!
(adsbygoogle = window.adsbygoogle || []).push({});