我用实体用户和权限建立了一个数据库
用户(id、电子邮件、密码、权限) 权限(id、create_user、delete_user、user_fk)
create_user 和 delete_user 是布尔值。
关系:一对一
现在每个用户都可以拥有自己的权限。
我的问题是:如何使用 shiro 从数据库中读取权限?
如果您真的只想在用户级别分配权限,您可以“伪造”角色表以使 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) 并返回关联的权限。
您应该在 .ini 文件中配置 JdbcReam:
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
如果您更改架构以遵守 shiro 查询,则不需要额外的配置。您需要表用户、用户角色和角色权限。
请参阅源代码,确切的列名应该是:
或者,您可以配置自己的查询以匹配 .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>