2014-11-03 106 views
1

我正在嘗試使用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查詢?

非常感謝您的時間!我希望能夠在我把頭部纏繞在一起時爲文檔做出貢獻。

回答

1

項目1: 我懷疑你可能會遇到涉及JdbcRealm默認爲「NO_SALT」的「salt style」參數的this issue。這會導致哈希工作,但如果您將密碼添加到密碼中,該領域將無法正確匹配它們。

以下是事後你的步驟:

用於A柱鹽基風格的默認查詢是如下:「選擇密碼,從用戶其中username = password_salt?」。如果您不能使用該結構,則需要通過具有類似結構的「shiro.ini」提供新的查詢。

jdbcRealm.authenticationQuery=select password, salt_column_here from users where username = ? 

這是related question

項目2:是的,領域調用了doCredentialsMatch(..)方法。

項目3:是的,領域提供AuthenticationInfo到doCredentialsMatch(..)方法。

+0

仍然很困惑,雖然你的鹽風格的鏈接肯定有幫助。 Salt樣式設置爲「COLUMN」後,如何指定實際包含鹽值的列? – Naitouk 2014-11-29 05:29:33

+0

嗨,Naitouk,我沒有意識到你曾問過一個後續問題。如果查看示例查詢,select子句有兩列「password」和「salt_column_here」。第二列是映射數據庫鹽列的內容,以便Shiro能夠找到它。 – 2015-04-16 13:24:24

相關問題