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

Posted

技术标签:

【中文标题】Apache Shiro - 自定义 jdbc 领域 - 读取角色/权限【英文标题】:Apache Shiro - custom jdbc Realm - reading roles/permissions 【发布时间】:2016-03-12 02:21:52 【问题描述】:

我正在将 Apache Shiro 实施到我的 Web 应用程序中,但在开始时遇到了问题。

我想从 postgreSQL 数据库加载角色和权限,并检查用户是否具有角色/权限。

我的角色权限系统包含以下内容:

用户 -> 有角色(可能有多个)

角色 -> 拥有权限(多个可能)

角色可以分配给多个用户,权限可以分配给多个角色

用户角色分配始终与其他两个条件相关:

一个组织单位(在我的例子中称为 OE) 教员

所以基本上用户“Faculty-Admin”可能有以下内容:

角色 OE-Admin 拥有 OE:3 和教员:员工的所有权利

所以他可以说 OE '3' 的 Faculty 'staff' 的 'manage_Users'

我知道如何在 shiro.ini 文件中实现角色,但由于我在数据库中拥有我的角色/权利(权限),我需要从那里加载它们。

在 Shiro 的快速入门示例中有以下示例:

# The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with
# license plate 'eagle5' (instance specific id)
goodguy = winnebago:drive:eagle5

如果我举这个例子并将其应用于我的情况,我会得到以下结果:

# The 'OE-Admin' role is allowed to 'manage_users' of OE '3' (type) with
# faculty 'staff'
OE-Admin = 3:manage_users:staff

所以我的角色定义是这样的:

Role = OE:Right:Faculty(或按顺序更改它们,真的很重要)

现在最大的问题是:如何从我的数据库中“加载”我的角色/权限,以获得具有权限的角色的这种声明格式??

到目前为止,我在 shiro.ini 中有以下内容:

ds = org.postgresql.Driver
ds.serverName = localhost
ds.user = admin
ds.password = admin
ds.databaseName = db_name
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $ds
jdbcRealm.permissionsLookupEnabled = true

我知道必须有一个像“jdbcRealm.userRolesQuery = SELECT ....”这样的条目 但我不知道如何按照我上面所说的方式加载角色。

它是否只是 .ini 文件的一个条目,相当于这样的静态角色集:goodguy = winnebago:drive:eagle5

或者需要哪些步骤来实现这一点?

Any1 有更多的 Apache Shiro 经验可以帮助我吗? 那里有一些教程,但我发现很难按照它们创建具有 owm 角色和权限的自定义 jdbc 领域。

编辑: 数据库结构:

用户:

id serial NOT NULL,
"user" character varying(50) NOT NULL,
CONSTRAINT umgmt_users_pkey PRIMARY KEY (id)

角色:

id serial NOT NULL,
role character varying(50) NOT NULL,
priv_level integer NOT NULL,
CONSTRAINT umgmt_roles_pkey PRIMARY KEY (id)

权利(权限):

id serial NOT NULL,
"right" character varying(50) NOT NULL,
CONSTRAINT umgmt_rights_pkey PRIMARY KEY (id)

为了以防万一,这是我存储 User-Role-OE-Fac 关系的表

id serial NOT NULL,
user_id integer NOT NULL,
oe_id integer NOT NULL,
fac_id integer NOT NULL,
role_id integer NOT NULL,
assigned_by_priv_level integer NOT NULL,
CONSTRAINT umgmt_user_oe_fac_role_pkey PRIMARY KEY (id),
CONSTRAINT fac_fkey FOREIGN KEY (fac_id)
  REFERENCES umgmt_facultys (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT oe_fkey FOREIGN KEY (oe_id)
  REFERENCES umgmt_oes (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT role_fkey FOREIGN KEY (role_id)
  REFERENCES umgmt_roles (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT user_fkey FOREIGN KEY (user_id)
  REFERENCES umgmt_users (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION

【问题讨论】:

非常好的问题。实际上,几周前我也被类似的事情困扰过。首先让我尝试了解您的解决方案:Users are assigned Roles,我假设每个用户只有 一个 角色,但相同的角色可以应用于 多个 用户。一个Role is assigned Rights(Permissions?),再次假设每个角色可以有多个权限,同样,相同的权限可以应用于多个用户。 编辑:请确认我的上述假设是否正确。 好的,接下来。请将您的 UserRolePermission 表的数据库结构包含在您的原始 OP 中。查询取决于您的架构。 您是在单独的表中设置和存储所有实体关系吗?:User-Role-OE-Fac Relations 的表,这个比较复杂,有更简单的方法。此外,角色表中的priv_level 是做什么用的?我在你的结构中没有看到这方面的参考。 让我们continue this discussion in chat。 【参考方案1】:

好的,经过与RevXaisks 的长时间讨论后,我会为此再睡一晚,但我认为 Shiro 在角色/权限检查方面不符合我的需求。 非常感谢您的耐心。

【讨论】:

以上是关于Apache Shiro - 自定义 jdbc 领域 - 读取角色/权限的主要内容,如果未能解决你的问题,请参考以下文章

SSM+Apache shiro--自定义realm

为 Apache Shiro 创建自定义登录页面 + bean

添加自定义过滤器 Apache Shiro + Spring Boot

对 Apache Shiro 和自定义授权领域感到困惑

无法在自定义 Apache Shiro AuthorizingRealm 中 @Inject 我的 DAO

自动装配在 Apache Shiro 自定义领域类中不起作用