0

私はtokenValiditySeconds_Config.groovy

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

ただし、サブドメインなどからのすべてのリクエストに対して異なる有効性を設定したいと考えています。オブジェクトからドメイン情報を識別できますが、クラスからrequestをオーバーライドできません。tokenValiditySecondsCustomRememberMeService

デフォルトでは、トークンは最後に成功した認証試行から 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);
    }
}
4

1 に答える 1

1

methodcalculateLoginLifetimeをオーバーライドします。デフォルトでは、これは構成で設定された値を返します ( を呼び出します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();
}
于 2013-09-12T12:34:05.550 に答える