ログイン時にアプリケーション言語を選択できるようにしたい。しかし、スプリングセキュリティを使用しているので、リクエストパラメータから選択した言語パラメータを取得する方法が本当にわかりませんか?
プロセス自体を変更せずにSpringセキュリティ認証プロセスをインターセプトする方法はありますか(カスタム認証の例をいくつか見つけましたが、現時点では必要ありません)?
または、さらにリダイレクトされる前にリクエストパラメータを取得するためのベストプラクティスは何でしょうか?ありがとう。
ログイン時にアプリケーション言語を選択できるようにしたい。しかし、スプリングセキュリティを使用しているので、リクエストパラメータから選択した言語パラメータを取得する方法が本当にわかりませんか?
プロセス自体を変更せずにSpringセキュリティ認証プロセスをインターセプトする方法はありますか(カスタム認証の例をいくつか見つけましたが、現時点では必要ありません)?
または、さらにリダイレクトされる前にリクエストパラメータを取得するためのベストプラクティスは何でしょうか?ありがとう。
次の場所で、(デフォルトではなく)独自の認証成功ハンドラーを設定できます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;
Grailsには、Spring-Securityとは関係なく、すべてのリクエストでユーザーの言語を変更するためのサポートがすでに組み込まれています。リクエストで呼び出されたパラメータを設定すると、そのパラメータlang
がインターセプトされ、ユーザーのロケールを設定するために使用されます。
たとえば、lang=XX
XXが2文字の言語コードまたはのような言語/国の組み合わせである場合に送信する入力要素をログインフォームに配置できます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)