SpringSecurity权限命名ROLE_问题

简介: SpringSecurity权限命名ROLE_问题

微信截图_20220524203809.png

最近在整理知识点的时候,对于SpringSecurity中的那个ROLE_真的感觉很奇怪,今天查了不少,找到一点点东西,可以丰富一些杂识哈。😁


喜欢的话,一起坚持啦!!!


SpringBoot集成Security


一、前言:


先讲一下我的好奇点:


最近在使用Security做安全权限控制,可以看到下图,这个方法可以通过的角色是USER,但是我的表中的数据是这样的。


微信截图_20220524204115.png


我就对于这个前缀ROLE_非常的好奇。(因为是许久之前的代码了,就忘记的差不多啦🐕狗头保命


我做过测试如果使用@PreAuthorize("hasAnyRole('USER')")此注解的话:总之得拼出ROLE_USER


  • 数据库上的那个权限or角色的字段必须为ROLE_USER


  • 又或者啊数据库写成 USER,但是在使用注解时写成这样也可以@PreAuthorize("hasAnyRole('ROLE_USER')")


微信截图_20220524204159.png

我测试访问是可以通过的,这样我就对于为什么一定要这样,就更好奇,所以就开始了属于我的好奇之旅哈。😂


二、目前所知


看完查到的博客,暂时还没有找到security的设计者这样设计的原因,但是对于为什么要这么去写,在源码中有所提及:


/**
投票是否有任何ConfigAttribute.getAttribute()以前缀开头,表明它是一个角色。 默认前缀字符串是ROLE_ ,
但这可以覆盖为任何值。 它也可以设置为空,这意味着基本上任何属性都将被投票。 
如下文进一步描述的,空前缀的效果可能不是很理想。
如果没有配置属性以角色前缀开头,则弃权。 
如果存在与以角色前缀开头的ConfigAttribute完全匹配的GrantedAuthority ,则投票授予访问权限。 
如果没有与以角色前缀开头的ConfigAttribute完全匹配的GrantedAuthority ,则投票拒绝访问。
空的角色前缀意味着投票者将为每个 ConfigAttribute 投票。
当使用不同类别的 ConfigAttributes 时,这将不是最佳的,因为投票者将为不代表角色的属性投票。
但是,当使用没有前缀的预先存在的角色名称时,此选项可能会有一些用处,并且无法在读取它们时使用角色前缀作为前缀,
例如在org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl 。
所有比较和前缀都区分大小写。
 */
public class RoleVoter implements AccessDecisionVoter<Object> {
  private String rolePrefix = "ROLE_";
  public String getRolePrefix() { return rolePrefix; }
  public void setRolePrefix(String rolePrefix) {this.rolePrefix = rolePrefix; }
    // 这里就是判断是否符合
  public boolean supports(ConfigAttribute attribute) {
    if ((attribute.getAttribute() != null)
        && attribute.getAttribute().startsWith(getRolePrefix())) {
      return true;
    }
    else {
      return false;
    }
  }
  public boolean supports(Class<?> clazz) {
    return true;
  }
    //判断是否授予访问权限。
  public int vote(Authentication authentication, Object object,
      Collection<ConfigAttribute> attributes) {
    if (authentication == null) {
      return ACCESS_DENIED;
    }
    int result = ACCESS_ABSTAIN;
    Collection<? extends GrantedAuthority> authorities = extractAuthorities(authentication);
    for (ConfigAttribute attribute : attributes) {
      if (this.supports(attribute)) {
        result = ACCESS_DENIED;
        // Attempt to find a matching granted authority
        for (GrantedAuthority authority : authorities) {
          if (attribute.getAttribute().equals(authority.getAuthority())) {
            return ACCESS_GRANTED;
          }
        }
      }
    }
    return result;
  }
  Collection<? extends GrantedAuthority> extractAuthorities(
      Authentication authentication) {
    return authentication.getAuthorities();
  }
}


有以下几个点:


  1. ROLE_是默认的一个前缀,可以覆盖,但是不建议为空,这点我在👉官方文档中也查询到了。因为如果为空的话,空的角色前缀意味着投票者将为每个 ConfigAttribute 投票。就是每个都可以通过的意思(自我理解)。


  1. 但是如果没有配置前缀的话,那么就会直接判定为权限不足,继而不通过。


  1. 只有以角色前缀开头ConfigAttribute完全匹配的GrantedAuthority(表示授予Authentication对象的权限) 的才能被授权访问。


就是权限名是完全一样才能被访问,否则就被拒绝。


三、自言自语


学习必须的带上兴趣,才能变得不一样,有动力,有冲劲。😁

感兴趣的话,大家可以再试着Debug、bug、bug一下下哦。


目录
相关文章
|
JavaScript
vue的监听键盘事件的快捷方法
在我们的项目经常需要监听一些键盘事件来触发程序的执行,而Vue中允许在监听的时候添加关键修饰符: 对于一些常用键,还提供了按键别名: 全部的按键别名:  .enter  .tab  .delete (捕获“删除”和“退格”键)  .esc  .space  .up  .down  .left  .right 修饰键:  .ctrl  .alt  .shift  .meta Do something 与按键别名不同的是,修饰键和 keyup 事件一起用时,事件引发时必须按下正常的按键。
2987 0
|
3月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
287 1
|
10月前
|
监控 Oracle Java
JDK 21中的分代ZGC:一场内存管理的革命
JDK 21引入了分代ZGC,为Java应用程序的内存管理带来了革命性的进步。分代ZGC通过将堆内存划分为年轻代和老年代,采用并发处理和染色指针技术,实现了高吞吐量、低延迟和更好的可扩展性。这一特性显著提升了系统的性能和稳定性。
865 51
|
9月前
|
数据库 微服务
SEATA模式
Seata 是一款开源的分布式事务解决方案,支持多种事务模式以适应不同的应用场景。其主要模式包括:AT(TCC)模式,事务分三阶段执行;TCC 模式,提供更灵活的事务控制;SAGA 模式,基于状态机实现跨服务的事务一致性;XA 模式,采用传统两阶段提交协议确保数据一致性。
260 5
|
小程序
【经验分享】如何生成支付宝小程序scheme链接
【经验分享】如何生成支付宝小程序scheme链接
3499 2
|
存储 JSON 安全
深入理解与实践:Token的使用及其在Web应用安全中的重要性
【7月更文挑战第3天】在现代Web应用程序中,Token作为一种关键的安全机制,扮演着维护用户会话安全、验证用户身份的重要角色。本文将深入探讨Token的基本概念、类型、工作原理,并通过实际代码示例展示如何在Web应用中实现Token的生成、验证及应用,以确保数据传输的安全性和用户认证的有效性。
3131 2
|
前端开发 网络架构
计算机网络——第一章时延部分深入学习、相关习题及详细解析
计算机网络——第一章时延部分深入学习、相关习题及详细解析
540 0
|
关系型数据库 数据库 数据安全/隐私保护
使用PostgreSQL进行高级数据库管理
【5月更文挑战第17天】本文介绍了使用PostgreSQL进行高级数据库管理,涵盖性能调优、安全性加强和备份恢复。性能调优包括索引优化、查询优化、分区和硬件配置调整;安全性涉及权限管理、加密及审计监控;备份恢复则讨论了物理备份、逻辑备份和持续归档。通过这些实践,可提升PostgreSQL的性能和安全性,确保数据资源的有效管理。
|
存储 安全 Java
Spring Boot中的OAuth2认证与授权
Spring Boot中的OAuth2认证与授权
|
SQL 数据库 索引
sql server 跨数据库查询
在 SQL Server 中,跨数据库查询是指在一个数据库查询中访问另一个数据库的数据。这通常是在同一 SQL Server 实例上的不同数据库之间进行的。跨数据库查询在很多场景下都很有用,比如数据整