5.5.1概覽
Remember-me與 UsernamePasswordAuthenticationFilter 一起使用拥坛,并通過 AbstractAuthenticationProcessingFilter 超類中的鉤子實現(xiàn)。它也應(yīng)用于 BasicAuthenticationFilter尘分。鉤子將在適當(dāng)?shù)臅r間調(diào)用具體的 RememberMeServices?猜惋。界面如下:
Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
void loginFail(HttpServletRequest request, HttpServletResponse response);
void loginSuccess(HttpServletRequest request, HttpServletResponse response,
? ? Authentication successfulAuthentication);
請參考JavaDoc以更全面地討論方法的作用,注意培愁,盡管在這個階段 AbstractAuthenticationProcessingFilter 只調(diào)用LoginFail()和LoginsAccess()方法著摔。每當(dāng) SecurityContextholder 不包含一個 Authentication 時,RememberMeAuthenticationFilter?就會調(diào)用 autologin() 方法竭钝。因此梨撞,此接口為基礎(chǔ)的remember-me實現(xiàn)提供了與身份驗證相關(guān)事件的充分通知雹洗,并在候選Web請求可能包含cookie并希望被記住時委托給實現(xiàn)。這種設(shè)計允許任何數(shù)量的“remember-me”實現(xiàn)策略卧波。上面我們已經(jīng)看到了Spring Security?提供了兩種實現(xiàn)时肿。我們依次看這些。
TokenBasedRememberMeServices
此實現(xiàn)支持第10.5.2節(jié) “Simple Hash-Based Token Approach”?????中描述的更簡單的方法港粱。TokenBasedRememberMeServices?生成一個RememberMeauthenticationToken螃成,由RememberMeauthenticationProvider?處理。此身份驗證提供程序和 TokenBasedRememberMeServices 之間共享key查坪。此外寸宏,TokenBasedRememberMeServices?需要一個 UserDetailsService?,它可以從中檢索用于簽名比較的用戶名和密碼偿曙,并生成 RememberMeAuthenticationToken?以包含正確的 GrantedAuthority s氮凝。應(yīng)用程序應(yīng)提供某種注銷命令,以使用戶請求以后使cookie失效望忆。TokenBasedRememberMeServices?還實現(xiàn)了Spring Security的 LogoutHandler?接口罩阵,因此可以與 LogoutHandler?一起使用,以便自動清除cookie启摄。
應(yīng)用程序上下文中啟用“記住我”服務(wù)所需的bean如下:
<bean id="rememberMeFilter" class=
"org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
<property name="rememberMeServices" ref="rememberMeServices"/>
<property name="authenticationManager" ref="theAuthenticationManager" />
</bean>
<bean id="rememberMeServices" class=
"org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<property name="key" value="springRocks"/>
</bean>
<bean id="rememberMeAuthenticationProvider" class=
"org.springframework.security.authentication.RememberMeAuthenticationProvider">
<property name="key" value="springRocks"/>
</bean>
不要忘記將 RememberMeServices 實現(xiàn)添加到您的UsernamePasswordAuthenticationFilter.setRememberMeServices()屬性中稿壁,在AuthenticationManager.setProviders()列表中包含RememberMeAuthenticationProvider,并將RememberMeAuthenticationFilter添加到您的FilterChainProxy?中(通常在您的UsernamePasswordAuthenticationFilter之后)歉备。
PersistentTokenBasedRememberMeServices
此類的使用方式與 TokenBasedRememberMeServices相同傅是,但它還需要配置一個 PersistentTokenRepository?來存儲令牌。這里有兩種標(biāo)準(zhǔn)實現(xiàn)蕾羊。
InMemoryTokenRepositoryImpl喧笔,僅用于測試。
JDBCtokenRepositoryImpl肚豺,它將令牌存儲在數(shù)據(jù)庫中溃斋。
上面第10.5.3節(jié) “Persistent Token Approach”. 描述了數(shù)據(jù)庫模式界拦。