2011-06-19 85 views
1

我正在開發一個具有彈簧安全性的應用程序。我有一個要求,當一個用戶被創建時,他被分配一個默認密碼。用戶必須重置密碼才能完全訪問其模塊。所以登錄後他不能訪問任何資源,直到他改變了他的密碼。Spring Security 3自定義身份驗證要求....需要幫助!

我有一個狀態標誌在我的數據庫,以保持用戶是否是新用戶還是不軌道。 我也有一個使用自定義JdbcDaoImpl

做這個請任何線索自定義身份驗證提供者?

回答

4

這聽起來像你有兩個不同的角色,ROLE_USER和ROLE_NEW_USER。技巧就是配置攔截器來指定你想要的角色。攔截器的工作是識別你想要保護的資源以及訪問它們需要的角色。

不指定所以讓我們假設你正在構建一個Web應用程序。默認情況下,你可能有某種FilterSecurityInterceptor。配置可能看起來像......

這就是說訪問所有URL被固定,需要ROLE_USER。如果你的Web應用程序碰巧有匹配該用例的網址您可能能夠做這樣的事情......

當然,如果你的Web應用程序是不是很爽快結構接下來的事情獲得技巧。例如,可能允許訪問/updateConfig?newpassword=foobar,以便用戶可以更改其密碼,但不應允許訪問/updateConfig?username=newname

在這種情況下,你將不得不放置在攔截一個較低的水平。也許你可以使用一個MethodSecurityInterceptor放置在你的配置服務訪問,以便setPassword方法ROLE_NEW_USER和setName方法ROLE_USER。只要記住,MethodSecurityInterceptor是一個方面,所以如果你有一個ConfigService類與setConfigsetPassword,並setName方法和Web服務調用setConfig這就要求setPasswordsetName那麼這將無法工作,因爲各方面不辦理方法中調用一類。

在這種情況下,您可能需要編寫自己的方面來檢查傳入方法的實際參數(如果可以的話,這本身就很脆弱,所以請避免使用它)。或者在最糟糕的情況下,你可以檢查setName方法本身的安全性(安全性是一個橫切關注點,理想情況下不應該包含在執行其他事情的方法中,這會降低內聚性,因爲方法現在有兩個責任)。

如果您確實需要滾動您自己的攔截器,您需要查看SecurityContext類,該類爲您提供當前線程的Authentication對象(例如請求)。

您還需要修改您的UserService實現,以便在它爲用戶提供適當角色(基於數據庫標記的ROLE_USER或ROLE_NEW_USER)時設置角色。

最後但並非最不重要的,你會想弄清楚你的應用程序如何處理認證失敗。在Web服務示例中,如果用戶未通過身份驗證,則可以將用戶重定向到更改密碼頁面。當然,如果他們是一個ROLE_NEW_USER和一個沒有角色的註冊頁面,將它們重定向到一個更改密碼頁面可能會很棘手。

1

您可能需要重新審視在以下情況下的光你的要求:

  • 管理員創建使用默認密碼爲弗雷德一個帳戶。

  • 弗雷德,有點不感興趣,不試圖登錄幾天。同時,知道(或已經猜到)Fred有新賬戶的Jim,使用默認密碼登錄Fred,重置它,現在可以做假裝Fred的事情...直到Fred終於嘗試使用他的帳戶,並且因爲他不知道密碼而失敗。

您不應該使用默認密碼。至少您應該爲每個新用戶生成一個隨機密碼,並通過一些(相對)安全的方式將其傳遞給用戶。

相關問題