Spring Security 中权限控制方式有哪些
创始人
2024-11-17 02:01:51
0次

Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Security 提供的方式做授权,也可以自定义授权逻辑。一句话,你想怎么玩都可以!

今天松哥来和大家介绍一下 Spring Security 中四种常见的权限控制方式。

  • 表达式控制 URL 路径权限
  • 表达式控制方法权限
  • 使用过滤注解
  • 动态权限

四种方式,我们分别来看。

 1.表达式控制 URL 路径权限

首先我们来看第一种,就是通过表达式控制 URL 路径权限,这种方式松哥在之前的文章中实际上和大家讲过,这里我们再来稍微复习一下。

Spring Security 支持在 URL 和方法权限控制时使用 SpEL 表达式,如果表达式返回值为 true 则表示需要对应的权限,否则表示不需要对应的权限。提供表达式的类是 SecurityExpressionRoot:

Spring Security 中权限控制方式有哪些

可以看到,SecurityExpressionRoot 有两个实现类,表示在应对 URL 权限控制和应对方法权限控制时,分别对 SpEL 所做的拓展,例如在基于 URL 路径做权限控制时,增加了 hasIpAddress 选项。

我们来看下 SecurityExpressionRoot 类中定义的最基本的 SpEL 有哪些:

Spring Security 中权限控制方式有哪些

可以看到,这些都是该类对应的表达式,这些表达式我来给大家稍微解释下:

表达式备注
hasRole用户具备某个角色即可访问资源
hasAnyRole用户具备多个角色中的任意一个即可访问资源
hasAuthority类似于 hasRole
hasAnyAuthority类似于 hasAnyRole
permitAll统统允许访问
denyAll统统拒绝访问
isAnonymous判断是否匿名用户
isAuthenticated判断是否认证成功
isRememberMe判断是否通过记住我登录的
isFullyAuthenticated判断是否用户名/密码登录的
principle当前用户
authentication从 SecurityContext 中提取出来的用户对象

这是最基本的,在它的继承类中,还有做一些拓展,我这个我就不重复介绍了。

如果是通过 URL 进行权限控制,那么我们只需要按照如下方式配置即可:

protected void configure(HttpSecurity http) throws Exception {
  http.authorizeRequests()
      .antMatchers("/admin/**").hasRole("admin")
      .antMatchers("/user/**").hasAnyRole("admin", "user")
      .anyRequest().authenticated()
      .and()
      ...
}

这里表示访问 /admin/** 格式的路径需要 admin 角色,访问 /user/** 格式的路径需要 admin 或者 user 角色。

2.表达式控制方法权限

当然,我们也可以通过在方法上添加注解来控制权限。

在方法上添加注解控制权限,需要我们首先开启注解的使用,在 Spring Security 配置类上添加如下内容:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  ...
  ...
}

这个配置开启了三个注解,分别是:

  • @PreAuthorize:方法执行前进行权限检查
  • @PostAuthorize:方法执行后进行权限检查
  • @Secured:类似于 @PreAuthorize

这三个结合 SpEL 之后,用法非常灵活,这里和大家稍微分享几个 Demo。

@Service
public class HelloService {
  @PreAuthorize("principal.username.equals('javaboy')")
  public String hello() {
    return "hello";
  }

  @PreAuthorize("hasRole('admin')")
  public String admin() {
    return "admin";
  }

  @Secured({"ROLE_user"})
  public String user() {
    return "user";
  }

  @PreAuthorize("#age>98")
  public String getAge(Integer age) {
    return String.valueOf(age);
  }
}
  • 第一个 hello 方法,注解的约束是,只有当前登录用户名为 javaboy 的用户才可以访问该方法。
  • 第二个 admin 方法,表示访问该方法的用户必须具备 admin 角色。
  • 第三个 user 方法,表示方法该方法的用户必须具备 user 角色,但是注意 user 角色需要加上 ROLE_ 前缀。第四个 getAge 方法,表示访问该方法的 age 参数必须大于 98,否则请求不予通过。

可以看到,这里的表达式还是非常丰富,如果想引用方法的参数,前面加上一个 # 即可,既可以引用基本类型的参数,也可以引用对象参数。

缺省对象除了 principal ,还有 authentication(参考第一小节)。

3.使用过滤注解

Spring Security 中还有两个过滤函数 @PreFilter 和 @PostFilter,可以根据给出的条件,自动移除集合中的元素。

@PostFilter("filterObject.lastIndexOf('2')!=-1")
public List getAllUser() {
  List users = new ArrayList<>();
  for (int i = 0; i < 10; i++) {
    users.add("javaboy:" + i);
  }
  return users;
}
@PreFilter(filterTarget = "ages",value = "filterObject%2==0")
public void getAllAge(List ages,List users) {
  System.out.println("ages = " + ages);
  System.out.println("users = " + users);
}
  • 在 getAllUser 方法中,对集合进行过滤,只返回后缀为 2 的元素,filterObject 表示要过滤的元素对象。
  • 在 getAllAge 方法中,由于有两个集合,因此使用 filterTarget 指定过滤对象。

以上就是Spring Security 中权限控制方式有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...