我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Security中的四种权限控制方式分别是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Security中的四种权限控制方式分别是什么

本篇文章为大家展示了Spring Security中的四种权限控制方式分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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中的四种权限控制方式分别是什么

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

Spring Security中的四种权限控制方式分别是什么

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

如果是通过 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);     } }
  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 第一个 hello 方法,注解的约束是,只有当前登录用户名为 javaboy 的用户才可以访问该方法。

  3. 第二个 admin 方法,表示访问该方法的用户必须具备 admin 角色。

  4. 第三个 user 方法,表示方法该方法的用户必须具备 user 角色,但是注意 user 角色需要加上ROLE_ 前缀。

  5. 第四个 getAge 方法,表示访问该方法的 age 参数必须大于 98,否则请求不予通过。

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

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

3.使用过滤注解

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

@PostFilter("filterObject.lastIndexOf('2')!=-1") public List<String> getAllUser() {     List<String> 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<Integer> ages,List<String> users) {     System.out.println("ages = " + ages);     System.out.println("users = " + users); }

在 getAllUser 方法中,对集合进行过滤,只返回后缀为 2 的元素,filterObject 表示要过滤的元素对象。

在 getAllAge 方法中,由于有两个集合,因此使用 filterTarget 指定过滤对象。

上述内容就是Spring Security中的四种权限控制方式分别是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring Security中的四种权限控制方式分别是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中引用传参的四种方式分别是什么

这篇文章将为大家详细讲解有关Python中引用传参的四种方式分别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。引用传参一:>>> a = 100 #这里的a是不可变类型>>> def
2023-06-22

Spring中接口注入的三种方式分别是什么

本篇文章为大家展示了Spring中接口注入的三种方式分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring中 接口注入的三种方式,上面的代码中,ClassA依赖于InterfaceB的
2023-06-17

vue各种权限控制与管理实现的方法是什么

这篇“vue各种权限控制与管理实现的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue各种权限控制与管理实现的方
2023-07-05

java框架中spring aop两种配置方式分别是什么

这篇文章给大家介绍java框架中spring aop两种配置方式分别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。注解配置AOP注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@
2023-06-17

VB.NET Main过程中的四种声明方法分别是什么

本篇文章为大家展示了VB.NET Main过程中的四种声明方法分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。VB.NET编程语言的应用范围非常广泛,其编写方式的特殊性极大的吸引了编程人员的
2023-06-17

Spring中Bean的4种依赖检查模式分别是什么

这期内容当中小编将会给大家带来有关Spring中Bean的4种依赖检查模式分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。下面我们来看看Spring中的Bean的4中依赖检查模式:simple,o
2023-06-17

JavaScript中检测数据类型的四种方法分别是什么

这期内容当中小编将会给大家带来有关JavaScript中检测数据类型的四种方法分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言:在介绍检测数据类型的方法之前,先说说JavaScript中数据类
2023-06-26

Java中运用数组的四种排序方法分别是什么

本篇文章给大家分享的是有关Java中运用数组的四种排序方法分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法
2023-06-17

Linux中3种修改打开文件数量限制的方法分别是什么

这篇文章给大家介绍Linux中3种修改打开文件数量限制的方法分别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当文件被打开访问时,操作系统临时分配一个名为文件句柄的数字。主内存的一个特殊区域是为文件句柄预留的,这
2023-06-28

Linux系统中将PNG和JPG批量互转的四种方法分别是什么

今天就跟大家聊聊有关Linux系统中将PNG和JPG批量互转的四种方法分别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。我们可以使用Linux命令行工具将.PNG 格式的图像批
2023-06-28

编程热搜

目录