2010-03-16 61 views
4

我試圖在我的網站上使用Spring實現「記住我」功能。 cookie和persistent_logins表中的條目正在正確創建。另外,我可以看到正確的用戶正在恢復,因爲用戶名顯示在頁面的頂部。在Spring Security中記住我的服務問題

但是,一旦我嘗試訪問這個用戶的任何信息,當他們被「記住」後返回時,我會得到一個NullPointerException。它看起來好像沒有再次在會話中設置用戶。

我的applicationContext-security.xml文件包含以下內容:

<remember-me data-source-ref="dataSource" user-service-ref="userService"/> 

... 

<authentication-provider user-service-ref="userService" /> 

<jdbc-user-service id="userService" data-source-ref="dataSource" 
role-prefix="ROLE_" 
users-by-username-query="select email as username, password, 1 as ENABLED from user where email=?" 
authorities-by-username-query="select user.id as id, upper(role.name) as authority from user, role, users_roles where users_roles.user_fk=id and users_roles.role_fk=role.name and user.email=?"/> 

我認爲它可能有一些東西需要與用戶按用戶名查詢,但肯定會登錄無法正常工作,如果該查詢是不正確的?

任何幫助,將不勝感激。

謝謝, gearoid。

+4

請記住,您可能會在您的安全配置中有兩個關鍵參數。用於RememberMeAuthenticationProvider,另一個用於TokenBasedRememberMeServices。確保他們是平等的。 – kboom

+0

@kboom謝謝你提到有兩個鍵! –

回答

4

你能否包括異常的整個堆棧跟蹤?我懷疑這是因爲您尚未在上面指定的remember-me配置上設置關鍵屬性,因此未在SecurityContextHolder上設置該標記。

要查看記住我如何工作的詳細信息,應該查看RememberMeAuthenticationFilter的來源。你可以在這裏找到源(直接):

http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.security/spring-security-web/3.0.2.RELEASE/org/springframework/security/web/authentication/rememberme/RememberMeAuthenticationFilter.java

RememberMeAuthenticationFilter會在RememberMeAuthenticationProvider調用作爲的結果:

rememberMeAuth = authenticationManager.authenticate(rememberMeAuth); 

內部認證方法中,你可以看到,它會拋出如果您沒有指定密鑰,則是一個例外:

if (this.key.hashCode() != ((RememberMeAuthenticationToken) authentication).getKeyHash()) { 
      throw new BadCredentialsException(messages.getMessage("RememberMeAuthenticationProvider.incorrectKey", 
        "The presented RememberMeAuthenticationToken does not contain the expected key")); 
     } 

密鑰可以字面上是任何字符串「your-c ompany-name- {GUID}「或類似的東西。那麼你的記憶我會看起來更像這樣:

<remember-me key="your-company-name-rmkey-aWeFFTgxcv9u1XlkswUUiPolizxcwsqUmml" token-validity-seconds="3600" data-source-ref="dataSource"/> 

設置令牌效度是一個非常好的主意,你應該這樣做。

格蘭特

相關問題