Acegi (Spring Security 前身) 的 RememberMeProcessingFilter 讓使用者勾選「記住我」後,下次造訪無需重新登入。本文詳細說明原理、配置步驟與關鍵 Bean 關係。
RememberMeProcessingFilter 解析並驗證。RememberMeAuthenticationToken 放入 SecurityContext,視同已認證。<input type="checkbox" name="rememberMe" /> 讓系統記住我
參數名 rememberMe 須與後端設定一致。
<!-- 1. TokenBasedRememberMeServices:產生/解析 Cookie -->
<bean id="rememberMeServices"
class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userDetailsService"/>
<property name="key" value="23_*!cdU='612./e;NrI"/> <!-- 加密金鑰 -->
<property name="parameter" value="rememberMe"/> <-- 對應 checkbox name -->
</bean>
<!-- 2. RememberMeAuthenticationProvider:驗證 Token -->
<bean id="rememberMeAuthenticationProvider"
class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="23_*!cdU='612./e;NrI"/> <-- 必須與上方 key 相同 -->
</bean>
<!-- 3. AuthenticationProcessingFilter 掛載 rememberMeServices -->
<bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="rememberMeServices" ref="rememberMeServices"/>
<!-- 其他屬性省略 -->
</bean>
<!-- 4. RememberMeProcessingFilter 加入 Filter 鏈 -->
<bean id="rememberMeProcessingFilter"
class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>
<!-- 5. 將 Provider 註冊至 AuthenticationManager -->
<bean id="authenticationManager"
class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref bean="daoAuthenticationProvider"/>
<ref bean="rememberMeAuthenticationProvider"/>
<ref bean="anonymousAuthenticationProvider"/>
</list>
</property>
</bean>
/**=httpSessionContextIntegrationFilter,
logoutFilter,
authenticationProcessingFilter,
rememberMeProcessingFilter, <-- 放在 authenticationProcessingFilter 之後
anonymousProcessingFilter,
exceptionTranslationFilter,
filterInvocationInterceptor
| 屬性 | 用途 |
|---|---|
key | 雙向加密金鑰,Services 與 Provider 必須一致,防止偽造 Cookie。 |
parameter | 對應登入表單 checkbox name,決定是否產生 Cookie。 |
userDetailsService | 驗證 Cookie 時重新載入 UserDetails,檢查帳號是否存在、密碼是否變更。 |
HttpOnly、Secure、SameSite=Strict。key,失效舊 Token。