私はtokenValiditySeconds
_Config.groovy
grails.plugins.springsecurity.rememberMe.tokenValiditySeconds=31*24*60*60
ただし、サブドメインなどからのすべてのリクエストに対して異なる有効性を設定したいと考えています。オブジェクトからドメイン情報を識別できますが、クラスからrequest
をオーバーライドできません。tokenValiditySeconds
CustomRememberMeService
デフォルトでは、トークンは最後に成功した認証試行から 14 日間有効です。これは、AbstractRememberMeServices.setTokenValiditySeconds(int) を使用して変更できます。この値が 0 未満の場合、expiryTime は 14 日のままですが、Cookie の maxAge プロパティには負の値が使用されます。つまり、ブラウザーを閉じたときに保存されません。
ドキュメントによると、メソッドを使用して有効性を変更できるはずですがsetTokenValiditySeconds(int)
、効果はありません。
では、設定ファイルに設定された値を上書きするにはどうすればよいでしょうか?
ありがとう。
編集:
class CustomRememberMeService extends TokenBasedRememberMeServices {
def springSecurityService;
public final LoggedInUserDetails customAutoLogin(HttpServletRequest request, HttpServletResponse response) {
def cookies = request.getCookies();
if (!cookies) return null;
String rememberMeCookie = extractRememberMeCookie(request);
for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];
if(c.getName().equals('remember_me') && rememberMeCookie == null) {
rememberMeCookie = c.getValue();
}
}
if (rememberMeCookie == null) return null
logger.debug("rememberMeCookie is : ${rememberMeCookie}");
if (rememberMeCookie.length() == 0) {
cancelCookie(request, response);
return null;
}
String[] cookieTokens = decodeCookie(rememberMeCookie);
String username = cookieTokens[0];
def loginContext = request.getParameter('loginContext')
loginContext = (loginContext == null) ? "mainWeb" : loginContext
setTokenValiditySeconds(60) // not working
LoggedInUserDetails user = getUserDetailsService().loadUserByUsername("${username}#${request.getServerName().trim()}#${loginContext}")
springSecurityService.reauthenticate("${username}#${request.getServerName().trim()}#${loginContext}")
}
}
resource.groovy ファイルは次のようになります。
//..
customRememberMeService(com.rwi.springsecurity.services.CustomRememberMeService) {
userDetailsService = ref('userDetailsService')
springSecurityService = ref('springSecurityService')
key = "${grailsApplication.config.grails.plugins.springsecurity.rememberMe.key}"
}
customRememberMeServicesFilter(CustomRememberMeServicesFilter){
authenticationManager = ref('authenticationManager')
rememberMeServices = ref('rememberMeServices')
customRememberMeService = ref('customRememberMeService')
}
//..
CustomRemeberMEService.groovy
// ..
class CustomRememberMeServicesFilter extends RememberMeAuthenticationFilter {
def customRememberMeService;
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (SecurityContextHolder.getContext().getAuthentication() == null) {
LoggedInUserDetails rememberMeAuth = customRememberMeService.customAutoLogin(request, response);
}
chain.doFilter(request, response);
}
}