用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用

用户授权中@Secured,@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这五个注解的使用

首选掌握几个英文单词的意思

Authorize:授权

Authentication:认证

secured:保护

在哪里使用?

这五个注解都是用在控制器中方法的上面的,如下图:

在这里插入图片描述

给Spring Security开启注解

首先在启动类或者配置类(带@Configuration注解的)中需要先开启注解,因为Spring Security默认是禁用注解的,要想开启注解需要在启动类或者配置类上加@EnableGlobalMethodSecurity注解;

如果要开启@Secured注解那么需要在启动类或者配置类中加上@EnanleGlobalMethodSecurity(securedEnabled=true)注解,如果要开启@PreAuthorize,@PostAuthorize,@PreFilter,@PostFilter这四个注解,需要在启动类或者配置类上加@EnableGlobalMethodSecurity(prePostEnabled = true)注解;

因此我们如果要想使用这五个注解,需要先在启动类上加上@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled=true)注解,去先在Spring Security开启这五个注解,然后才能使用它们,在启动类中开启注解如下图:

在这里插入图片描述

@Secured注解

@Secured注解的作用:在用户向浏览器发送一个请求时会去访问控制器中的方法,然后在访问此控制器中的方法之前会先去UserDetailsService用户细节实现类的实现方法中return的User对象查看是否具有@Secured注解中指定的角色,如果有指定的角色,那么系统允许用户访问此控制器方法,否则,系统不允许访问此控制器方法;注意在使用@Secured设置角色名字的时候,角色名的前面一定要加上ROLE_前缀;如下图:

在这里插入图片描述

UserDetailsService用户细节实现类中的情况如下图:

在这里插入图片描述

UserDetailsService中的用户具有ROLE_xzy角色,因此可以访问控制器中的update方法,在浏览器中的访问如下图:

在这里插入图片描述

@PreAuthorize注解(访问方法之前进行权限认证)

@PreAuthorize注解的作用:在浏览器发送一个请求后,会访问控制器中的对应的方法,@PreAuthorize注解会在访问控制器中的方法之前进行权限认证,看看UserDetailsService用户细节实现类中对应的用户有没有相应的权限,如果有那么该用户发送的请求可以进入控制器中对应的方法,如果没有相应的权限,那么用户发送的请求不能进去控制器中对应的方法;

@PreAuthorize注解的使用如下图:

在这里插入图片描述

UserDetailsService用户细节实现类中的情况如下图:

在这里插入图片描述

UserDetailsService中的用户具有admins权限,因此可以访问控制器中的update2方法,在浏览器中的访问如下图:在这里插入图片描述

@PostAuthorize注解(访问方法之后进行权限认证)

@PostAuthorize注解的作用:在访问控制器中的相关方法之后(方法的return先不访问),进行权限认证,去看看UserDetailsService用户细节实现类中用户是否有对应的权限,如果有的话,那么控制器方法的最后一句return语句会执行,否则,控制器方法的最后一句return语句不会执行;

@PostAuthorize注解的使用如下图:

在这里插入图片描述

UserDetailsService用户细节实现类中的情况如下图:

在这里插入图片描述

因为用户细节实现类中的用户只有admins权限没有admins4或者admins5权限,因此控制器中的return语句不会执行,请求访问浏览器后的情况如下图:

在这里插入图片描述

然后可以发现idea的控制台中update3方法中的语句是可以输出的如下图:

在这里插入图片描述

这就表示使用@PostAuthorize注解的时候,会先执行控制器中的方法,执行到最后一句return的时候,再进行权限认证;

@PostFilter注解

注意@PostFilter注解只有在控制器方法的return返回值是一个集合的时候才可以使用;

@PostFilter注解的作用:如果控制器方法的return返回值是一个集合,此注解可以对return的这个集合进行过滤输出;

使用@PostFilte注解可以对集合类型的返回值进行过滤。使用@PostFilter时,Spring Security将移除使对应表达式即的结果为false的元素。

@PostFilter注解的使用如下图:

在这里插入图片描述

上图中的filterObject是使用@PreFilter和@PostFilter时的一个内置表达式,表示集合中的当前对象。

浏览器中对应的结果如下图:

在这里插入图片描述

@PreFilter注解

注意:只有在控制器方法的参数是集合类型的时候才能使用@PreFilter注解

@PreFilter注解的作用:可以过滤控制器方法的参数;

这个注解我在测试的时候是这五个注解里面唯一一个没有测试成功的,因此我去百度上百度了一下其他博主对此注解的总结,然后直接粘贴到了下面,如果哪位仁兄知道这个注解该怎样测试的话,还望赐教;

百度粘贴如下:

filterObject是使用@PreFilter和@PostFilter时的一个内置表达式,表示集合中的当前对象。当@PreFilter标注的方法拥有多个集合类型的参数时,需要通过@PreFilter的filterTarget属性指定当前@PreFilter是针对哪个参数进行过滤的。
 如下面代码就通过filterTarget指定了当前@PreFilter是用来过滤参数ids的

   @PreFilter(filterTarget="ids", value="filterObject%2==0")
   public void delete(List<Integer> ids, List<String> usernames) {
      ...
   }

猜你喜欢

转载自blog.csdn.net/qq_45950109/article/details/112982204