2013-09-09 4 views
0

У меня есть tokenValiditySeconds набор в Config.groovy вКак настроить пользовательский тайм-аут для того, чтобы помнить, что я купил в grails spring security?

grails.plugins.springsecurity.rememberMe.tokenValiditySeconds=31*24*60*60 

Однако я хочу, чтобы установить различные действия для всех запросов, что исходит от, скажем, суб-домен. Я могу определить информацию о домене с объекта request, но я не могу переопределить tokenValiditySeconds из класса CustomRememberMeService.

По умолчанию токены будут действительны в течение 14 дней с последней успешной попытки аутентификации . Это можно изменить с помощью AbstractRememberMeServices.setTokenValiditySeconds (int). Если это значение меньше нуля, время истечения будет оставаться в 14 дней, но отрицательное значение будет использовано для свойства maxAge файла cookie, , что означает, что он не будет сохранен при закрытии браузера.

Согласно документации, я должен иметь возможность изменить срок действия с использованием метода setTokenValiditySeconds(int), но он не имеет никакого эффекта.

Итак, как переопределить значение, заданное в файле конфигурации?

Спасибо.

Edit:

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); 
    } 
} 
+0

вы можете показать свой CustomRememberMyService и как вы его регистрации (например ваш конф/весна/resources.groovy) – ikumen

+0

user2264997: ок. Я обновлю его. В настоящее время я далеко от кода. – boring

+0

Обновите вопрос, чтобы включить текущий код. – boring

ответ

1

переопределять метод calculateLoginLifetime, по умолчанию это будет возвращать значение как установлено в конфигурации (он вызывает getTokenValiditySeconds(). переопределяя это, вы можете определить (на основе запроса), если нормальный тайм-аут должен быть принят или пользовательский.

protected int calculateLoginLifetime(HttpServletRequest request, Authentication authentication) { 
    if (request.getRemoteAddr().startsWith("subdomain") { 
     return 15; // Or whatever you want, you could also make it configurable. 
    } 
    return getTokenValiditySeconds(); 
} 
+0

Спасибо, что ответили. Я посмотрю, но это займет довольно много времени. После этого ответит. – boring

+0

Это не работает. Он по-прежнему использует значение, указанное в файле конфигурации. – boring

+0

Убедитесь, что вы ** только ** переопределяете 'calculateLoginLifetime' и что ваш экземпляр также является фактическим экземпляром, который используется. –