spring-security实现方法级别、页面端的权限控制(结合黑马SSM实现权限管理项目)
目录
spring-security实现方法级别、页面端的权限控制(结合黑马SSM实现权限管理项目)
1.方法级别权限控制
1.JSR-250注解使用
- 导入JSR-250 maven坐标
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
- 在spring-security.xml中开启
<security:global-method-security jsr250-annotations="enabled"/>
- 在指定的方法上使用
- 在web.xml中配置错误页面,并创建403.jsp页面
- 启动项目,测试!
2.Secured注解使用
- 在spring-security.xml中开启secured的注解使用 (不用导入依赖)
<!--开启使用secured注解-->
<security:global-method-security secured-annotations="enabled"/>
- 在指定的方法上使用
注意事项:在使用JSR-250注解时,ROLE_ 前缀可省略,而在使用@Secured是不能省略前缀的!!
3.基于表达式操作
- 在spring-security.xml中开启表达式注解的使用
<!--开启使用pre-post注解-->
<security:global-method-security pre-post-annotations="enabled"/>
- 在方法上使用(可以使用SPEL表达式)
Spring Security允许我们在定义URL访问或方法访问所应有的权限时使用Spring EL表达式,在定义所需的访问权限时如果对应的表达式返回结果为true则表示拥有对应的权限,反之则无。Spring Security可用表达式对象的基类是SecurityExpressionRoot,其为我们提供了如下在使用Spring EL表达式对URL或方法进行权限控制时通用的内置表达式。
表达式 | 描述 |
hasRole([role]) | 当前用户是否拥有指定角色。 |
hasAnyRole([role1,role2]) | 多个角色是一个以逗号进行分隔的字符串。如果当前用户拥有指定角色中的任意一个则返回true。 |
hasAuthority([auth]) | 等同于hasRole |
hasAnyAuthority([auth1,auth2]) | 等同于hasAnyRole |
Principle | 代表当前用户的principle对象 |
authentication | 直接从SecurityContext获取的当前Authentication对象 |
permitAll | 总是返回true,表示允许所有的 |
denyAll | 总是返回false,表示拒绝所有的 |
isAnonymous() | 当前用户是否是一个匿名用户 |
isRememberMe() | 表示当前用户是否是通过Remember-Me自动登录的 |
isAuthenticated() | 表示当前用户是否已经登录认证成功了。 |
isFullyAuthenticated() | 如果当前用户既不是一个匿名用户,同时又不是通过Remember-Me自动登录的,则返回true。 |
spel表达式参考:https://www.cnblogs.com/lukelook/p/11169666.html
2.页面端权限控制
- 导入maven坐标
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
- 在jsp页面导入
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
- 在页面上使用
authentication : 可以获取当前正在操作的用户信息
可参考我另一篇播客:https://blog.csdn.net/qq_45441466/article/details/109558443
authorize :用于控制页面上某些标签是否可以显示
eg:只有ROLE_ADMIN角色才能显示用户管理
在spring-security.xml中也需要修改:
将是否使用SPEL表达式改为 true ,并且access 改为spel表达式
此时测试没有角色ROLE_ADMIN的用户,是没有用户管理这一栏的!
若你不想改use-expressions 和 access,可以在spring-security.xml中添加:
<bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"/>
- 常用标签