我正在嘗試使用Shiro對正在構建的JSF Web應用程序進行身份驗證和授權。不幸的是,我仍然困難地圍繞着它如何融合在一起。Shiro - 無法使用散列密碼進行身份驗證
我已經成功(使用shiro.ini文件100%)將認證配置回存儲測試證書集的JDBC領域。當證書以純文本形式存儲時,它對我來說非常合適。
我的最終目標是統一MySQL數據庫中的現有憑證集。密碼存儲爲SHA-256鹽霧散列。我花了整整一天的時間閱讀可用的文檔(減去Javadoc),但我仍然有一些難以理解如何設置它。
在試圖分階段實施,我已經修改了我shiro.ini與僅使用SHA-256的意圖如下哈希:
[main]
dataSource = org.apache.shiro.jndi.JndiObjectFactory
dataSource.resourceName = jdbc/Communicator_dev
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $dataSource
dataSource.resourceRef = true;
jdbcRealm.authenticationQuery = select password from account where site_id = ?
jdbcRealm.userRolesQuery = select user_role from web_roles where site_id = ?
# From https://stackoverflow.com/questions/20742666/shiro-with-jdbc-and-hashed-passwords.
#
passwordService = org.apache.shiro.authc.credential.DefaultPasswordService
#configure the passwordService to use the settings you desire
#...
passwordMatcher = org.apache.shiro.authc.credential.PasswordMatcher
passwordMatcher.passwordService = $passwordService
#...
# Finally, set the matcher on a realm that requires password matching for account authentication:
jdbcRealm.credentialsMatcher = $passwordMatcher
實際登錄的邏輯是在頁面的支持計劃豆。下面是我目前使用的簡單測試來源:
// Create auth token
UsernamePasswordToken token = new UsernamePasswordToken(this.siteID, this.password);
// Get the current subject
Subject currentUser = SecurityUtils.getSubject();
// Attempt to login
try {
currentUser.login(token);
} catch (AuthenticationException e) {
System.out.println("Invalid creds.");
return "";
}
return "authenticated.xhtml?faces-redirect=true";
此代碼工作完全存儲在我的RDBMS明文密碼,但現在,我已經散列他們,它的失敗。
從我對框架的理解中,我認爲問題在於AuthenticationToken。我知道我需要使用不同的標記來最終實現存儲在我的RDBMS中的Salted哈希,但我對如何繼續進行操作感到困惑。
(1)我不想重新發明輪子。 Shiro有沒有這樣做的本質?我檢查過Les的鏈接PasswordMatcher和PasswordService(從鏈接shiro with jdbc and hashed passwords),但這仍然不清楚。我是否需要分類密碼匹配器? (2)一個架構問題:誰實際上調用了doCredentialsMatch(..)方法?在登錄(...)方法的執行過程中它是否是領域?
(3)doCredentialsMap(...)方法的AuthenticationInfo參數是否由Realm提供?由於Realms封裝了實際的安全數據,這是一個對象,在我的情況下是從RDBMS返回密碼的SQL查詢?
非常感謝您的時間!我希望能夠在我把頭部纏繞在一起時爲文檔做出貢獻。
仍然很困惑,雖然你的鹽風格的鏈接肯定有幫助。 Salt樣式設置爲「COLUMN」後,如何指定實際包含鹽值的列? – Naitouk 2014-11-29 05:29:33
嗨,Naitouk,我沒有意識到你曾問過一個後續問題。如果查看示例查詢,select子句有兩列「password」和「salt_column_here」。第二列是映射數據庫鹽列的內容,以便Shiro能夠找到它。 – 2015-04-16 13:24:24