2017-10-09 72 views
0

我的語言環境網址在我的春天啓動應用程序的一部分多語言登錄頁面:Spring Security。基於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) 
} 

}

的問題是什麼是處理兩個丘斯托的最佳方式Spring中的m個登錄頁面?當受限制的url包含/ en用戶應該被重定向到/ en /登錄頁面(使用英語),否則如果頁面具有默認語言環境,則應該重定向到/ login url(使用默認語言)

回答

0

spiring security you can 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

謝謝Hicham,但據我所知,您的答案涉及成功驗證後將用戶重定向到何處。我需要以相反的方式做到這一點:到什麼登錄頁面發送用戶進行身份驗證。 – 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() 
    } 
}