【Spring Security】安全框架学习(十二)

这篇具有很好参考价值的文章主要介绍了【Spring Security】安全框架学习(十二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

6 其他小问题

6.0 其他权限校验方法

我们前面都是使用@PreAuthorize注解,然后在在其中使用的是hasAuthority方法进行校验。Spring Security还为我们提供了其它方法.

例如:hasAnyAuthority,hasRole,hasAnyRole,等。

这里我们先不急着去介绍这些方法,我们先去理解hasAuthority的原理,然后再去学习其他方法就会更容易理解。并且我们也可以选择定义校验方法,实现我们自己的校验逻辑。

hasAuthority方法实际是执行到了SecurityExpressionRoot的hasAuthority,大家只要断点调试既可知道它内部的校验原理。

它内部其实是调用authentication的getAuthorities方法获取用户的权限列表。然后判断我们存入的方法参数数据在权限列表中。

6.0.1 源码理解

在 SecurityExpressionRoot 这个类的内部可以看到hasAuthority方法是怎么实现的。

【Spring Security】安全框架学习(十二)

这个方法的参数authority实际上就是 @PreAuthorize(“hasAuthority(‘test’)”) 这个注解中的 ‘test’ 。可以注意的是,在hasAuthority方法的内部又调用了一个方法 hasAnyAuthority 。

这个方法接收了一个字符串的可变参,也就是说它本身可以接收多个字符串的参数,可见它的本质还是一个数组。

【Spring Security】安全框架学习(十二)

同时在 hasAnyAuthority 方法内部 又调用了 hasAnyAuthorityName方法。但是我们并不用关心它在内部的调用链路,只需要关注核心的实现代码就可以了。

【Spring Security】安全框架学习(十二)

在 hasAnyAuthorityName 这个方法里面有两个参数,一个参数是prefix,在hasAnyAuthority方法中传进来的时候是null。第二个参数roles也就是之前的authorities传教来的参数。

在第二行使用了一个set集合、泛型是String的变量,在创建的时候调用了方法getAuthoritySet (获取权限集合)。

【Spring Security】安全框架学习(十二)

观察 getAuthoritySet 方法 ,发现它的执行流程是首先判断roles是否为空,如果为空就走到if的里面去,而接下来的一条语句就是核心代码。这里接收了 this.authentication ,这个就是我们之前在filter中存入到holder当中的对象,即UsernamePasswordAuthenticationToken,可以知道这里userAuthorities拿到了我们的权限对象,最终就调用到了我们自己在LoginUser类中重写的方法里去。

然后又将我们的数据进行了处理,把list集合转化为了set集合。

最终返回的set集合,是一个String类型的。

这个set集合被hasAnyAuthorityName 方法拿到,而这个权限信息其实就是当前用户所具有的权限信息。然后判断当前用户有没有访问接口的权限,hasAnyAuthorityName 方法的roles参数就是访问接口所需要具有的权限。就是拿roles这个元素到getAuthoritySet 判断是否存在。

接着在hasAnyAuthorityName 方法中使用for循环遍历参数。在for循环中拿着role去执行了方法 getRoleWithDefaultPrefix ,这个方法在内部对字符串做了一个拼接。它会拿一个前缀和我们的权限字符串做一个拼接。
【Spring Security】安全框架学习(十二)

但是回到hasAnyAuthorityName 方法中,传进去的prefix前缀的值实际上是null,也就是说实际上并没有做一个拼接,没有前缀,最终的结果也就是原本的字符串。如果有权限就会返回一个true,没有权限就会返回一个false。

从上面的源码中我们可以发现,hasAnyAuthority方法实际上可以传入多个权限,只只要用户有其中任意一个权限都可以访问对应资源。

传入多个权限的写法:

//标注在controller层
@PreAuthorize("hasAuthority('test','admin')")

hasRole要求有对应的角色才可以访问,但是它内部会把我们传入的参数拼接上ROLE_后再去比较。所以这种情况下要用用户对应的权限也要有ROLE_这个前缀才可以。

如果直接向下面这种写法然后直接执行的话,会访问不了。

@PreAuthorize("hasRole('test')")

我们用户即使有这个权限,也会访问不了,我们来看一下这个对应的源码。
【Spring Security】安全框架学习(十二)

在hasRole这个方法内部又调用了一个方法hasAnyRole,

【Spring Security】安全框架学习(十二)

这个方法在传入参数的时候,this.defaultRolePrefix 传进来一个 ‘ROLE_’ 。是role的一个前缀,而这个 “ROLE_” 就是默认的前缀。

【Spring Security】安全框架学习(十二)

在hasAnyAuthorityName方法内部,它获取到了这个权限,还要拿这个权限拼接上一个前缀,拼接之后再和集合中的元素做一个判断。

hasAnyRole有任意的角色就可以访问。它内部也会把我们传入的参数拼接上 ROLE_ 后再去比较。所以这种情况下要用用户对应的权限也要有**ROLE_**这个前缀才可以。文章来源地址https://www.toymoban.com/news/detail-467926.html

@PreAuthorize("hasRole('admin','test')")

到了这里,关于【Spring Security】安全框架学习(十二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Security】让你的项目更加安全的框架

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Security》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一

    2024年02月04日
    浏览(56)
  • spring boot中常用的安全框架 Security框架 利用Security框架实现用户登录验证token和用户授权(接口权限控制)

    spring boot中常用的安全框架 Security 和 Shiro 框架 Security 两大核心功能 认证 和 授权 重量级 Shiro 轻量级框架 不限于web 开发 在不使用安全框架的时候 一般我们利用过滤器和 aop自己实现 权限验证 用户登录 Security 实现逻辑 输入用户名和密码 提交 把提交用户名和密码封装对象

    2024年02月06日
    浏览(52)
  • Spring Boot 优雅集成 Spring Security 5.7(安全框架)与 JWT(双令牌机制)

    本章节将介绍 Spring Boot 集成 Spring Security 5.7(安全框架)。 🤖 Spring Boot 2.x 实践案例(代码仓库) Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring

    2024年02月12日
    浏览(52)
  • 【深入浅出 Spring Security(十二)】使用第三方(Github)授权登录

    (Github授权登录的具体操作在目录第三“章”) 下面是《深入浅出Spring Security》书中的一段概述: OAuth 是一个开放标准(现在所说的 OAuth 一般都是指 OAuth2,即 2.0 版本),可以理解为是一种协议,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头

    2024年02月10日
    浏览(59)
  • Spring Security 框架详解

    Spring Security是一款基于Spring框架的认证和授权框架,提供了一系列控制访问和保护应用程序的功能,同时也支持基于角色和权限的访问控制,加密密码,CSRF防范,会话管理等多种功能。Spring Security可以轻松地与其他Spring框架,如Spring Boot和Spring MVC进行集成使用。 本文将会对

    2024年02月04日
    浏览(39)
  • Spring Security 框架

    认证链 Spring Security的认证处理链是一系列的过滤器链,用于处理用户的身份验证和授权操作。这些过滤器在请求处理过程中依次执行,并在不同的阶段进行不同的认证和授权操作,以确保应用程序的安全性和完整性。 下面是Spring Security的标准认证处理链: UsernamePasswordAuthe

    2024年02月08日
    浏览(50)
  • SpringBoot——Spring Security 框架

    优质博文:IT-BLOG-CN Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC , DI (控制反转 Inversion of Control , DI : Dependency Injection 依赖注入)和 AOP (面

    2024年02月04日
    浏览(34)
  • [SpringBoot]Spring Security框架

    目录 关于Spring Security框架 Spring Security框架的依赖项 Spring Security框架的典型特征  关于Spring Security的配置 关于默认的登录页 关于请求的授权访问(访问控制)  使用自定义的账号登录 使用数据库中的账号登录 关于密码编码器 使用BCrypt算法 关于伪造的跨域攻击 使用前后端分

    2024年02月08日
    浏览(38)
  • 【Spring Security系列】一文带你了解权限框架与Spring Security核心概念

    权限框架是软件开发中用于管理 用户权限和访问控制 的工具。在企业或者我们毕设复杂的系统中,不同的用户或角色需要拥有不同的访问和操作权限,以确保系统的安全性和数据完整性。今天我们就讨论一下Java中的安全框架! 在企业的开发中,Spring Security,Shiro都是比较流

    2024年04月16日
    浏览(39)
  • 在Spring Boot框架中集成 Spring Security

    技术介绍 SpringSecurity的核心功能: SpringSecurity特点: 具体实现 1、集成依赖 2、修改spring security 实现service.impl.UserDetailsServiceImpl类 代码1具体解释 代码2具体解释 实现config.SecurityConfig类 代码具体解释 总结 Spring Security是一个基于Spring框架的安全性框架,它提供了一系列的安全性

    2024年02月14日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包