2013-10-30 59 views
4

我建立了一个数据库,与实体相关的用户和权限Apache Shiro为每个用户提供不同的权限?

用户(ID,邮箱,密码,权限) 许可(ID,create_user,DELETE_USER,user_fk)

create_user和DELETE_USER是布尔值。

关系:一对一

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

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

回答

4

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

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

如果你改变你的模式坚持四郎查询,不需要额外的配置。您需要表用户,user_roles和roles_permissions。

看到源代码的具体列名应该是这样:

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> 
5

如果你真的只想分配用户级别的权限,你可以“伪造”角色表,让四郎快乐。

正如Wouter提到的,使用JdbcRealm并为您的表格设置指定3个查询。 你应该修改权限表有​​这样的结构:

permission (id, permissionname, user_fk) 

然后根据需要插入的create_user/DELETE_USER权利行。 通过这种方式,向设置添加另一个权限(例如reset_password)非常简单,无需修改数据库模式。

在shiro.ini(或你如何调用你四郎配置文件):

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)并返回关联的权限。

+1

这太棒了! – xwb1989