Apache Shiro 决定登录后使用啥角色

Posted

技术标签:

【中文标题】Apache Shiro 决定登录后使用啥角色【英文标题】:Apache Shiro decide what role to use after loginApache Shiro 决定登录后使用什么角色 【发布时间】:2018-10-28 19:22:41 【问题描述】:

我有一个现有的遗留项目,它是使用 Spring 3 和 Apache Shiro 构建的,用于身份验证和授权。它使用 JDBC 领域。

我们已通过分配给权限的权限和授予用户权限的权限来实施授权。

场景是这样的:

use1: fooRole, barRole

fooRole: foo.permission.1, foo.permission.2

barRole: bar.permission.1, bar.permission.2

我被要求使用“user1”登录并在登录后选择“user1”想要使用的角色。例如:

    正确的登录用户1 选择 fooRole 或 barRole 选择 fooRole,现在使用“foo.permission.1, foo.permission.2”权限进行操作。

According tho the shiro architecture 在我的应用程序中,我有一个只读的“主题”。安全经理从我的数据库中获取信息。我可以检查主题是否具有特定的角色或权限。但是,一旦我登录后,我就看不到将用户角色更改为主题的方法。

我认为这不是 Apache Shiro 应该工作的方式,这可能不是最佳实践,但无论如何: 在 Apache Shiro 中,你们中的任何人都知道明确选择一个分配的角色来操作吗?

感谢大家的宝贵时间。

【问题讨论】:

【参考方案1】:

您可以在运行时更改用户权限。有一个关于这个问题的讨论here。这是您在自定义 Shiro 领域中必须做的事情,因为它是您设计的唯一可以访问 AuthorizationInfo 的地方。 AuthorizationInfo 存储授权数据,例如由单个主题表示的权限和角色。在您的领域之外没有 getter 和 setter 可供主体分配角色和权限。您可以随时查看:

如果主题拥有权限:SecurityUtils.getSubject().isPermitted(); 如果主题担任角色:SecurityUtils.getSubject().hasRoles();

AuthorizationInfo 的最简单实现是SimpleAuthorizationInfo

恕我直言这是一种不好的做法,原因有很多。这不是 Shiro 的目的。

【讨论】:

谢谢它对我帮助很大。我同意。 为什么这是不好的做法,原因有很多?我能看到的唯一原因是 Shiro 在开发时并未考虑到标准 RBAC——会话中角色的激活和停用自 90 年代中期以来一直是 RBAC 的基本概念,并且符合 ANSI/NIST 标准。出于多种原因,这应该是良好的做法!

以上是关于Apache Shiro 决定登录后使用啥角色的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache Shiro 处理分层角色/权限?

如何使用带有 LDAP 身份验证的 Apache Shiro 添加角色授权

简单两步快速实现shiro的配置和使用,包含登录验证角色验证权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)

如何根据 HTTP 请求方法使用 Apache Shiro 进行基于角色的授权

使用 apache shiro 的用户角色与用户权限

Apache Shiro - 自定义 jdbc 领域 - 读取角色/权限