2013-09-10 121 views
10

目前我有一個Swing應用程序,我不想集成Apache Shiro以驗證和委派對某些角色的權限。我已經成功地讀取,我已經做檢查創建的shiro.ini文件中的用戶,它看起來是這樣的:Apache Shiro - 使用數據庫讀取用戶,角色和權限

[users] 
admin = 123456, Administrator 

[role] 
Administrator = *:*:* 

然而,這只是爲了測試,現在我需要閱讀許可證從數據庫所以我存儲在數據庫與信息的表,我需要和它看起來是這樣的:

users (id,password,username) 
userRoles (userId, role) 
rolePermission (permissionID,permission,roleID) 

我一直在試圖理解,使用JDBC領域的教程,但他們使用網絡應用程序或特殊框架來管理它們與數據庫的連接,比如Apache Derby或BoneCP,並且他們更多地使用these示例來混淆我。

所以我問的是我需要如何配置shiro.ini文件,如果我想使用JDBC領域(與Oracle數據庫)和shiro.ini需要什麼類。任何例子或解釋將不勝感激!

+0

在我嘗試一個答案之前,你知道如何使用JDBC並且你理解關係數據庫嗎? –

+0

@BalusC不是他們,我說網上的例子,是的,他們非常簡單,只要你使用.ini文件來獲得用戶角色和許可,但是當你想從關係數據庫中檢索這些信息時,就沒有這個問題 – Nivde

+0

@SotiriosDelimanolis I'我不是專家,但對我的理解JDBC是一個應用程序編程接口,允許您從Java語言執行數據庫操作 – Nivde

回答

8

Realm接口是可訪問應用程序特定的安全 實體,如用戶,角色和權限,以確定 認證和授權操作的

安全組件。

您可以實現它來與任何來源進行交互以查找用戶及其權限。如果你想與一個基於SQL的數據庫進行交互,你可以這樣做。如果你想與文本文件交互,你可以這樣做。如果您想與Web服務交互,也可以這樣做。

Realm有兩個有用的(幾乎是必須的)擴展名,分別是AuthenticatingRealmAuthorizingRealm。它們分別爲認證和授權服務提供接口。 AuthorizingRealm延伸AuthenticatingRealm。您應該擴展AuthorizingRealm以實現您自己的身份驗證和授權邏輯。

以一個例子:你有一個數據庫表Accounts作爲

username | password | role 

Permissions作爲

permission_id | permission_name 

和一張桌子Account_Permissions

username | permission_id 

換句話說,一個Account可以有一個角色,但是多個權限。使用JDBC,您可以非常輕鬆地查詢這樣的數據庫並檢索用戶名,密碼,角色和權限。您的AuthorizingRealm的實現將做到這一點,並構建Shiro的API預期的對象。

在Shiro的認證序列上閱讀this document以瞭解AuthenticatingRealm的來源。

對於INIfile,這取決於你如何實現你的Realm,你就需要將其申報爲

myRealm = com.company.security.shiro.YourDatabaseRealm 

可能設置一些屬性

myRealm.databaseName = account_database 

四郎提供了自己的JdbcRealm類延伸AuthorizingRealm。這個類對數據庫的結構做了一些假設,但是你可以自定義它。

+0

最後,我不得不使用BoneCP爲Shiro提供數據源,我期望管理一個連接,而不必使用任何外部庫。感謝您耐心解釋這個問題非常有幫助,最後我設法實現了Shiro,並理解了這些概念,因爲您在這裏簡要介紹了這些概念。 – Nivde

+0

@ nivde92不客氣。請注意,無論您使用的是什麼'DataSource',上述都適用。有兩個不同的層我們正在談論。 –

+0

示例表僅反映*基於用戶的權限,而不是基於角色的權限。 *基於角色*通常也意味着一個主題可以有多個角色。 –