在服务器端我们可以通过 Spring security 提供的注解对方法来进行权限控制。
Spring Security在方法的权限控制上支持三种类型的注解:JSR-250
注解、@Secured
注解和支持表达式的注解。
这三种注解默认都是没有启用的,需要单独通过global-method-security
元素的对应属性进行启用
一、JSR-250 注解
1. 前期配置
(1)pom.xml 导入相关依赖
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
(2)在 spring-security.xml 开启该注解
<security:global-method-security jsr250-annotations="enabled" >
</security:global-method-security>
(3)在需要权限控制的方法上添加注解:
-
@RolesAllowed
表示访问对应方法时所应该具有的角色
@RolesAllowed({"USER","ADMIN"})
该方法只要具有"USER"
,"ADMIN"
任意一种权限就可以访问。这里可以省略前缀ROLE_
,实际的权限可能是ROLE_ADMIN
-
@PermitAll
表示允许所有的角色进行访问,也就是说不进行权限控制 -
@DenyAll
是和PermitAll相反的,表示无论什么角色都不能访问
2. 使用示例
现在这里的要求是只有具有 ADMIN 权限的用户才能查询产品信息
(1)可以看到用户 Jack 具备 ADMIN 权限所以可以查看产品信息
(2)Mark 不具备ADMIN 权限,访问产品信息时,会报403错误,提示权限不足
二、@Secured注解
该注解不需要额外导入pom.xml
(1)配置 spring-security.xml
<!--开启 @Secured注解-->
<security:global-method-security secured-annotations="enabled" ></security:global-method-security>
(2)具体使用
注意这里分配权限时,需要指定完整名称加入前缀 ROLE_
,不能省略
三、支持表达式的注解
@PostAuthorize
允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId or
hasPermission(returnObject, 'ADMIN')");
@PostFilter
允许方法调用,但必须按照表达式来过滤方法的结果@PreFilter
允许方法调用,但必须在进入方法之前过滤输入值
这里拿 @PostAuthorize
举例讲解:
(1)spring-security.xml 开启注解
<!--开启支持表达式的注解-->
<security:global-method-security pre-post-annotations="enabled"> </security:global-method-security>
(2)具体使用
(3)常用的内置表达式:
表达式 | 描述 |
---|---|
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。 |