在grails中拦截Spring安全性以获取一些请求参数

时间:2012-06-11 14:43:46

标签: java grails internationalization request

我希望用户可以在登录时选择应用程序语言。但由于我们使用spring security,我真的不确定如何从请求参数中获取选定的语言参数?

有没有办法在不修改进程本身的情况下拦截spring安全认证过程(因为我找到了一些自定义认证的例子,但我目前不需要这样做)?

或者在进一步重定向之前检索请求参数的最佳做法是什么?感谢。

2 个答案:

答案 0 :(得分:1)

您可以在resources.groovy

设置自己的(而不是默认的)身份验证成功处理程序
authenticationSuccessHandler(MyAuthenticationSuccessHandler) {
}

其中MyAuthenticationSuccessHandler是实现AuthenticationSuccessHandler的类,或者更好地扩展默认使用的AjaxAwareAuthenticationSuccessHandler,例如:

authenticationSuccessHandler(AjaxAwareAuthenticationSuccessHandler) {
    requestCache = ref('requestCache')
    defaultTargetUrl = conf.successHandler.defaultTargetUrl // '/'
    alwaysUseDefaultTargetUrl = conf.successHandler.alwaysUseDefault // false
    targetUrlParameter = conf.successHandler.targetUrlParameter // 'spring-security-redirect'
    ajaxSuccessUrl = conf.successHandler.ajaxSuccessUrl // '/login/ajaxSuccess'
    useReferer = conf.successHandler.useReferer // false
    redirectStrategy = ref('redirectStrategy')
}

此课程可以访问实际的请求:

void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws IOException, ServletException;

答案 1 :(得分:0)

Grails已经内置支持在每个请求上更改用户的语言,而不依赖于spring-security。如果您在任何请求中放置一个名为lang的参数,它将被拦截并用于设置用户的语言环境。

例如,您可以在登录表单上放置一个输入元素,提交lang=XX,其中XX是双字符语言代码或语言/国家/地区组合,如en_GB。 Grails将自动更新与该会话关联的区域设置。请注意,这将覆盖用户浏览器可能已发送的Accept-Language标头。

要手动更新区域设置,您可以执行以下操作:

import org.springframework.web.servlet.support.RequestContextUtils
import org.springframework.beans.propertyeditors.LocaleEditor

def localeResolver = RequestContextUtils.getLocaleResolver(request)
def localeEditor = new LocaleEditor()
localeEditor.setAsText(params.lang)
localeResolver?.setLocale(request, response, localeEditor.value)