4

我用实体用户和权限建立了一个数据库

用户(id、电子邮件、密码、权限) 权限(id、create_user、delete_user、user_fk)

create_user 和 delete_user 是布尔值。

关系:一对一

现在每个用户都可以拥有自己的权限。

我的问题是:如何使用 shiro 从数据库中读取权限?

4

2 回答 2

5

如果您真的只想在用户级别分配权限,您可以“伪造”角色表以使 Shiro 满意。

正如 Wouter 所提到的,使用JdbcRealm并为您的表设置指定 3 个查询。您应该修改您的权限表以具有以下结构:

permission (id, permissionname, user_fk)

然后根据需要为 create_user/delete_user 权限插入行。这样,在您的设置中添加另一个权限(例如reset_password)非常简单,而无需修改数据库模式。

在 shiro.ini 中(或者你如何调用你的 shiro 配置文件):

jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm

对于查询,请使用:

jdbcRealm.authenticationQuery = select password from user where email=?
jdbcRealm.userRolesQuery = select id from user where email=?
jdbcRealm.authenticationQuery = select permissionname from permission where user_fk=?

您设置中的小技巧是:您根本没有角色,因此我们只返回用户的 id 作为角色名称。当权限表中的查找完成后,它会使用角色名称 (=user pk) 并返回关联的权限。

于 2013-11-03T13:23:52.037 回答
4

您应该在 .ini 文件中配置 JdbcReam:

jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm

如果您更改架构以遵守 shiro 查询,则不需要额外的配置。您需要表用户、用户角色和角色权限。

请参阅源代码,确切的列名应该是:

https://svn.apache.org/repos/asf/shiro/trunk/core/src/main/java/org/apache/shiro/realm/jdbc/JdbcRealm.java

或者,您可以配置自己的查询以匹配 .ini 文件中的架构,如下所示:

jdbcRealm.authenticationQuery=<your password select statement>
jdbcRealm.userRolesQuery=<your role names for username select statement>
jdbcRealm.authenticationQuery=<your permissions for role name select statement>
于 2013-11-02T08:16:30.843 回答