IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Security 4 中的 hasRole 和 hasAuthority 差异引发的思考 -> 正文阅读

[Java知识库]Spring Security 4 中的 hasRole 和 hasAuthority 差异引发的思考

前言:

在使用 Spring Security 的时候我们必然会使用到如下两种访问权限配置中的一种:

  • 第一种:
http.authorizeRequests()
        .antMatchers("/root/**").hasAuthority("root")
        .antMatchers("/admin/**").hasAuthority("admin")
        .anyRequest().authenticated()
  • 第二种:
http.authorizeRequests()
        .antMatchers("/root/**").hasRole("root")
        .antMatchers("/admin/**").hasRole("admin")
        .anyRequest().authenticated()

那么这两种配置有什么区别呢?今天就来聊一聊这个问题。


一、源码分析:

hasAuthority 实现如下:
在这里插入图片描述在这里插入图片描述

我们在调用 hasAuthority 方法时,如果数据是从数据库中查询出来的,这里的权限和数据库中保存一致即可,可以不加 ROLE_ 前缀。即数据库中存储的用户角色如果是 admin,这里就是 admin。

hasRole 实现如下:
在这里插入图片描述在这里插入图片描述

可以看到,hasRole 的处理逻辑和 hasAuthority 似乎差不多,不同的是,hasRole 这里会自动给传入的字符串加上 ROLE_ 前缀,所以在数据库中的权限字段的值需要加上 ROLE_ 前缀。即数据库中存储的用户角色如果是 ROLE_root,这里就是 root。

综上使用 hasAuthority 显得更加方便,不用考虑要不要加 ROLE_ 前缀,数据库权限字段的值是什么样就是什么样。而 hasRole 则不同,代码里如果写的是 root,框架会自动加上 ROLE_ 前缀,所以数据库就必须是 ROLE_root。

看起来 hasAuthorityhasRole 的区别就是有没有 ROLE_ 前缀。然而在最终的权限比对中 hasAuthorityhasRole 居然最终都是调用了 hasAnyAuthorityName 方法。
在这里插入图片描述
hasAnyRole 在调用 hasAnyAuthorityName 方法时设置了 ROLE_ 前缀,hasAnyAuthority 在调用 hasAnyAuthorityName 方法时没有设置前缀。
在这里插入图片描述
所以我们单纯从源码角度来看,hasRole 和 hasAuthority 这两个功能似乎一模一样,除了前缀之外就没什么区别了。

那么 Spring Security 设计者为什么要弄两个功能几乎一模一样的东西呢?

authority 描述的的是一个具体的权限,例如针对某一项数据的查询或者删除权限,它是一个 permission,例如 read_employee、delete_employee、update_employee 之类的,这些都是具体的权限,相信大家都能理解。

role 则是一个 permission 的集合,它的命名约定就是以 ROLE_ 开始,例如我们定义的 ROLE 是 ROLE_ADMIN、ROLE_USER 等等。我们在 Spring Security 中的很多地方都能看到对 Role 的特殊处理,权限管理的投票器与表决机制中,RoleVoter 在处理 Role 时会自动添加 ROLE_ 前缀。

在项目中,我们可以将用户和角色关联,角色和权限关联,权限和资源关联。


github 上 Spring Security 的 issue 有人提出了类似问题:https://github.com/spring-projects/spring-security/issues/4912

从作者对这个问题的回复中,可以得出:
在这里插入图片描述

1、作者承认了目前加 ROLE_ 前缀的方式一定程度上给开发者带来了困惑,但这是一个历史积累问题。
2、作者说如果不喜欢 ROLE_,那么可以直接使用 hasAuthority 代替 hasRole,言下之意,就是这两个功能是一样的。
3、作者还说了一些关于权限问题的看法,权限是典型的对对象的控制,但是 Spring Security 开发者不能向 Spring Security 用户添加所有权限,因为在大多数系统中,权限都过于复杂庞大而无法完全包含在内存中。当然,如果开发者有需要,可以自定义类继承自 GrantedAuthority 以扩展其功能。

从作者的回复中我们也可以看出来,hasAuthority 和 hasRole 功能上没什么区别,设计层面上确实是两个不同的东西。


比较 Spring Security 几次大版本的更新,可以得出在 Spring Security 4 之前,hasAuthority 和 hasRole 几乎是一模一样的,没有 ROLE_ 的区别。就是说 hasRole(“root”) 和 hasAuthority(“root”) 是一样的。而在 Spring Security 4 之后,才有了前缀 ROLE_ 的区别。

Spring Security 3 迁移至 Spring Security 4 更新说明文档如下:https://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-jc.html#m3to4-role-prefixing

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:13:45  更:2022-05-16 11:16:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:04:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码