Spring Security的服务端的权限控制

三种类型的注解:

JSR-250注解、@Secured注解、支持表达式的注解

配置文件
开启注解配置
<security:global-method-security jsr250-annotations="enabled"/>
<security:global-method-security secured-annotations="enabled"/>
<security:global-method-security pre-post-annotations="disabled"/>

JSR-250注解:
1、Spring Security.xml开启注解
2、在方法上添加权限控制
@RolesAllowed表示访问对应方法时所应该具有的角色(常用)
@PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制
@DenyAll是和PermitAll相反的,表示无论什么角色都不能访问
3、导入坐标
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>jsr250-api</artifactId>
    <version>1.0</version>
</dependency>

@Secured注解:

1.开启注解:

2.在方法上添加权限控制

@Secured("ROLE_TELLER")
区别:和JSR-250注解
jsr-250可以省略ROLE_前缀,
Secured不能省略。
 
支持表达式的注解
1.开启注解
2.
@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
示例:
@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
void changePassword(@P("userId") long userId ){ }
这里表示在changePassword方法执行之前,判断方法参数userId的值是否等于principal中保存的当前用户的
userId,或者当前用户是否具有ROLE_ADMIN权限,两种符合其一,就可以访问该方法。
@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
示例:
@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId or
hasPermission(returnObject, 'ADMIN')");
@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值
 
  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。

 

 
 posted on 2020-06-08 14:27  爱舔奶盖的小野狼  阅读(268)  评论(0)    收藏  举报