2017-10-09 13 views
0

に基づく多言語ログインページ:スプリングセキュリティ。私は私の春のブートアプリケーションでのURLの一部としてロケールを持っているURL

/サイト - デフォルトロケール

/EN /サイト - 英語ロケール

私はカスタムインターセプタを使用しますこのために:

import org.springframework.beans.propertyeditors.LocaleEditor 
import org.springframework.util.Assert 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter 
import org.springframework.web.servlet.support.RequestContextUtils 

import javax.servlet.ServletException 
import javax.servlet.http.HttpServletRequest 
import javax.servlet.http.HttpServletResponse 
import java.util.Locale 
import java.util.regex.Pattern 

class CustomLocaleChangeInterceptor : HandlerInterceptorAdapter() { 

private var localePattern: Pattern? = null 

private fun setLocalePattern(localePattern: String) { 
    Assert.isTrue(localePattern.matches(".*\\(.*\\).*".toRegex()), "Your pattern needs to define a match group") 
    this.localePattern = Pattern.compile(localePattern) 
} 

@Throws(ServletException::class) 
override fun preHandle(request: HttpServletRequest?, response: HttpServletResponse?, handler: Any?): Boolean { 

    this.setLocalePattern("(en)") 

    val pathTranslated = request!!.requestURI.substring(request.contextPath.length) 

    if (pathTranslated.isNotEmpty()) { 
     val matcher = localePattern!!.matcher(pathTranslated) 
     if (matcher.find()) { 
      resolver(request, response, matcher.group(1)) 
     } else { 
      resolver(request, response, "th") 
     } 
    } 
    // Proceed in any case. 
    return true 

} 

private fun resolver(request: HttpServletRequest, response: HttpServletResponse?, locale: String) { 
    val localeResolver = RequestContextUtils.getLocaleResolver(request) ?: throw IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?") 
    val localeEditor = LocaleEditor() 
    localeEditor.asText = locale 
    localeResolver.setLocale(request, response, localeEditor.value as Locale) 
} 

}

質問は2つのクストを処理するための最良の方法は何であるかでありますm春のログインページ?制限されたURLに/ enが含まれている場合、ユーザーは/ en/loginページ(英語)にリダイレクトする必要があります。そうでない場合はページにデフォルトのロケールがある場合は/ login url(デフォルト言語)にリダイレクトする必要があります

答えて

0

spiring security in useこの

import java.io.IOException; 
import java.util.Set; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.security.core.Authentication; 
import org.springframework.security.core.authority.AuthorityUtils; 
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; 
import org.springframework.stereotype.Component; 

    @Component 
    public class Securityhandler implements AuthenticationSuccessHandler { 

    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { 
    Local local= LocaleContextHolder.getLocale(); 
    if(local.equals("yourcodeLang"){ 
     response.sendRedirect("/yourUrl"); 
    } 
    else // your logic 
    } 
    } 

と、このようなあなたの設定更新:

@Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .anyRequest().authenticated() 
       .... 
       .successHandler(yourSuccessHandlerBean) // autowired or defined 
       ... 
     } 
+0

ありがとうございますが、わかりましたが、あなたの答えは、認証が成功した後にユーザーをリダイレクトする場所に関連しています。私は逆の方法でそれを行う必要があります:どのログインページにユーザーに認証を送信するか。 – pszkv

0

。一方、私はこの解決策を見つけたの。多分完璧ではないが、それは機能する。

@EnableWebSecurity 
@Order(1) 
class SecurityConfigTH : WebSecurityConfigurerAdapter() { 

    private val localePattern: Pattern = Pattern.compile("^/en(\$|/)") 

    @Throws(Exception::class) 
    override fun configure(http: HttpSecurity) { 
     http 
       .authorizeRequests() 
        .anyRequest().authenticated() 
        .and() 
       .requestMatcher { !localePattern.matcher(it.requestURI.toString()).find() } 
       .formLogin() 
        .loginPage("/login") 
        .permitAll() 
    } 
} 

@EnableWebSecurity 
@Order(2) 
class SecurityConfigEN : WebSecurityConfigurerAdapter() { 

    private val localePattern: Pattern = Pattern.compile("^/en(\$|/)") 

    @Throws(Exception::class) 
    override fun configure(http: HttpSecurity) { 
     http 
       .authorizeRequests() 
        .anyRequest().authenticated() 
        .and() 
       .requestMatcher { localePattern.matcher(it.requestURI.toString()).find() } 
        .formLogin() 
        .loginPage("/en/login") 
        .permitAll() 
    } 
} 
関連する問題