0
点赞
收藏
分享

微信扫一扫

Spring Security鉴权注解


一、JSR250规范注解

需要通过以下方式来开启JSR250注解的识别

@EnableMethodSecurity(jsr250Enabled = true)  //默认为false

以下的注解都在jakarta.annotation.security包下

  • RolesAllowed:允许指定的角色访问
  • DenyAll:拒绝所有的访问
  • PermitAll:放开所有的访问

这几个注解都是通过AuthorizationManagerBeforeMethodInterceptor拦截器来进行识别。

使用示例:

@RolesAllowed("admin")  //admin角色,在内部判断时会先自动加上"ROLE_"
public void read(){}

@PermitAll
public void allowAll(){}

@DenyAll
public void notAllow(){}


二、Secured注解

需要通过以下方式来开启Secured注解的识别

@EnableMethodSecurity(securedEnabled = true) //默认为false

@Secured注解在org.springframework.security.access.annotation包下,根据注解上配置的值与认证后的Authentication中保存的GrantedAuthority直接对比

这个注解都是通过AuthorizationManagerBeforeMethodInterceptor拦截器来进行识别的。

使用示例:

//该注解上的值与认证后的Authentication中保存的GrantedAuthority直接比较
@Secured({ "ROLE_USER", "P001" })
public void update(){}

三、Pre/Post注解

需要通过以下方式来开启注解的识别

@EnableMethodSecurity(prePostEnabled = true) //默认就为

以下几个都在org.springframework.security.access.prepost包下

  • PreAuthorize:方法被调用前进行表达式的执行,注解的值为Spring-EL表达式,表达式返回true则允许执行。该注解对应的拦截器是:AuthorizationManagerBeforeMethodInterceptor
  • PostAuthorize:方法调用后进行表达式的执行,注解的值为Spring-EL表达式,使用的拦截器为:AuthorizationManagerAfterMethodInterceptor
  • PreFilter:定义了一个Spring-EL表达式的规则,用于筛选方法的返回列表。其逻辑是将该规则应用于列表中的每个元素。如果计算值为 true,则该元素将保留在列表中。否则,该元素将被删除。对应的拦截器为:PreFilterAuthorizationMethodInterceptor
  • PostFilter:对方法的数据参数筛选将应用于作为输入参数传递给带注释的方法的列表。使用的拦截器是:PostFilterAuthorizationMethodInterceptor]

以上的注解都是使用Spring-EL表达式,通过对Spring-EL表达式的计算来保护对方法的访问,表达式返回ture(表示满足条件)或false。

使用示例:

//执行方法后对其进行验证(并可能更改结果)
@PostAuthorize("returnObject.username == authentication.principal.nickName")
User findByUserName(String username);

//方法执行前进行权限检查
//只有具备ROLE_USER角色和ROLE_ADMIN角色的用户才能访问
@PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
void update(){}

//根据参数集合的每个Task对象的assignee属性进行过滤
//保留assignee的值与当前登录人名称相同的数据
@PreFilter("filterObject.assignee == authentication.name")
Iterable<Task> save(Iterable<Task> entities) {}

//根据返回结果列表中每个task对象的assignee属性进行过滤
//保留assignee的值与当前登录人名称相同的数据
@PostFilter("filterObject.assignee == authentication.name")
List<Task> findAll() {}


关于Spring-EL表达可参考:https://zhuanlan.zhihu.com/p/174786047


举报

相关推荐

0 条评论