在 Spring Security中授予权限与角色
创始人
2024-04-10 11:21:42
0

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的用户来演示粗粒度的授权要求。

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

@Override
protected void configure(HttpSecurity http) throws Exception {// ....antMatchers("/protectedbyrole").hasRole("USER").antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE")// ...
}

6. 简单的数据初始化

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

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

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

@Override
@Transactional
public void onApplicationEvent(ContextRefreshedEvent event) {MyPrivilege readPrivilege= createPrivilegeIfNotFound("READ_PRIVILEGE");MyPrivilege writePrivilege= createPrivilegeIfNotFound("WRITE_PRIVILEGE"); 
}

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

7.用户详细信息服务

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

private Collection getAuthorities(Collection roles) {List authorities= new ArrayList<>();for (Role role: roles) {authorities.add(new SimpleGrantedAuthority(role.getName()));role.getPrivileges().stream().map(p -> new SimpleGrantedAuthority(p.getName())).forEach(authorities::add);}return authorities;
}

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 安全性中角色授予权限之间的微妙但显着的区别。

相关内容

热门资讯

兴业银行厦门分行精准落地外汇便... 深化跨境投融资外汇管理改革、服务实体经济高质量发展是当前金融工作的重要导向。兴业银行厦门分行主动响应...
盗刷他人医保账户购药,广东高院... 12月30日,广东省高级人民法院发布3起医保骗保犯罪典型案例,涉及盗刷他人医保账户购药、冒名骗保倒卖...
原创 电... 23.14亿元索赔额度,相当于欣旺达2023年和2024年扣非归母净利润总和近九成 投资时间网、...
政策+技术双轮驱动,这个板块连... 随着全球贸易一体化加速和数字经济蓬勃发展,跨境支付已从外贸行业的“配套服务”升级为驱动全球经济循环的...
永吉法院:法官多方寻踪化纠纷,... 正义之声网讯 (永吉法院 车美静)在日常生活中,民间借贷作为亲友间常见的经济互助形式,却常因还款问题...
永吉法院:调解化纠纷 为企业发... 正义之声网讯 (永吉法院 刘洋)近日,永吉县人民法院岔路河法庭成功调解一起公路货物运输合同纠纷案件,...
明确了!化妆、医药、饮料业这一... 化妆、医药和饮料制造业迎来利好政策。 近日,财政部、税务总局发布《关于广告费和业务宣传费支出税前扣除...
货拉拉:取消车贴违约金制度、解... IT之家 12 月 30 日消息,货拉拉、滴滴送货、快狗打车、满帮集团等四家互联网道路货运平台企业在...
不到一个月被告一千多次 绿地控... 12月30日,绿地控股(600606)发布公告,公司及控股子公司在2025年12月3日至12月27日...