文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

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

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

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

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

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 {     ...     ... }

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

这三个结合 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯