• 在 Spring Security中授予权限与角色


    1. 概述

    在这篇快速文章中,我们将解释Spring 安全性中角色授予权限之间的微妙但显着的区别。有关角色和权限的更多详细信息,请参阅此处的文章。

    2.授权

    在Spring Security中,我们可以将每个GrantedAuthority视为一个单独的特权。示例可能包括READ_AUTHORITYWRITE_PRIVILEGE 甚至CAN_EXECUTE_AS_ROOT。重要的是要了解该名称是任意的

    当直接使用GrantedAuthority时,例如通过使用像 hasAuthority('READ_AUTHORITY') 这样的表达式,我们以细粒度的方式限制访问

    正如你可能收集到的那样,我们也可以通过使用特权来引用权威的概念。

    3. 作为权威的角色

    类似地,在 Spring Security 中,我们可以将每个角色视为一个粗粒度的GrantedAuthority,它表示为字符串并以“ROLE”为前缀。当直接使用角色时,例如通过像hasRole(“ADMIN”)这样的表达式,我们以粗粒度的方式限制访问。

    值得注意的是,默认的“ROLE”前缀是可配置的,但解释如何做到这一点超出了本文的范围。

    这两者之间的核心区别在于我们对如何使用该功能的语义。对于框架来说,差异很小——它基本上以完全相同的方式处理这些问题。

    4. 容器角色

    现在我们已经了解了框架如何使用角色概念,让我们也快速讨论一个替代方案 -即将角色用作权限/特权的容器

    这是一种更高层次的角色方法,使它们成为更面向业务的概念,而不是以实施为中心的概念。

    Spring 安全框架没有就我们应该如何使用这个概念提供任何指导,所以选择完全是特定于实现的。

    5. 弹簧安全配置

    我们可以通过将访问/保护权限限制为具有READ_AUTHORITY的用户来演示细粒度的授权要求。

    我们可以通过将访问/protectedbyrole限制为具有ROLE_USER的用户来演示粗粒度的授权要求。

    让我们在安全配置中配置这样的场景:

    1. @Override
    2. protected void configure(HttpSecurity http) throws Exception {
    3. // ...
    4. .antMatchers("/protectedbyrole").hasRole("USER")
    5. .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE")
    6. // ...
    7. }

    6. 简单的数据初始化

    现在我们更好地理解了核心概念,让我们谈谈在应用程序启动时创建一些设置数据。

    当然,这是一种非常简单的方法,可以在开发过程中与一些初步测试用户一起开始运行 - 而不是您应该在生产中处理数据的方式。

    我们将侦听上下文刷新事件:

    1. @Override
    2. @Transactional
    3. public void onApplicationEvent(ContextRefreshedEvent event) {
    4. MyPrivilege readPrivilege
    5. = createPrivilegeIfNotFound("READ_PRIVILEGE");
    6. MyPrivilege writePrivilege
    7. = createPrivilegeIfNotFound("WRITE_PRIVILEGE");
    8. }

    此处的实际实现并不重要 - 通常取决于您使用的持久性解决方案。重点是 - 我们保留了我们在代码中使用的权限。

    7.用户详细信息服务

    我们的UserDetailsService实现是进行权限映射的地方。一旦用户通过身份验证,我们的getAuthority()方法就会填充并返回一个UserDetails对象:

    1. private Collection getAuthorities(
    2. Collection roles) {
    3. List authorities
    4. = new ArrayList<>();
    5. for (Role role: roles) {
    6. authorities.add(new SimpleGrantedAuthority(role.getName()));
    7. role.getPrivileges().stream()
    8. .map(p -> new SimpleGrantedAuthority(p.getName()))
    9. .forEach(authorities::add);
    10. }
    11. return authorities;
    12. }

    8. 运行和测试示例

    我们可以执行示例RolesAuthorityApplicationJava 应用程序,可以在GitHub 项目中找到。

    若要查看基于角色的授权的实际应用,我们需要:

    • 访问 http://localhost:8082/protectedbyrole
    • user@test.com 身份进行身份验证(密码为“用户”)
    • 注意授权成功
    • 访问 http://localhost:8082/protectedbyauthority
    • 注意授权失败

    要查看基于权限的授权,我们需要注销应用程序,然后:

    • 访问 http://localhost:8082/protectedbyauthority
    • asadmin@test.com/ 管理员进行身份验证
    • 注意授权成功
    • 访问 http://localhsot:8082/protectedbyrole
    • 注意授权失败

    9. 结论

    在这个快速教程中,我们研究了 Spring 安全性中角色授予权限之间的微妙但显着的区别。

  • 相关阅读:
    【软件工程】简单讲讲设计模式七大原则,以及代码简单举例
    【Leetcode HOT100】完全平方数c++
    凉鞋的 Unity 笔记 101. Hello Unity
    Jetson Agx_Orin(Ubuntu20.04)设置vnc远程桌面记录
    WebSocket协议:实现实时双向通信的秘诀
    区间预测 | Matlab实现GRU-Attention-KDE核密度估计多置信区间多变量回归区间预测
    第五章 C++与STL入门 例题
    MySQL增删改查(基础)
    表单控件绑定:checkbox表单绑定v-model
    Java使用多线程做批处理(查询大量数据)
  • 原文地址:https://blog.csdn.net/allway2/article/details/127947289