2013-10-30 34 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