2017-10-09 1 views
0

Je locales comme une partie de l'URL dans mon application Boot Spring:Sécurité de printemps. page de connexion multilangue basé sur url

/site - locale par défaut

/fr/site - paramètres régionaux anglais

J'utilise intercepteur personnalisé pour cela:

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) 
} 

}

la question est quelle est la meilleure façon de gérer deux custo m pages de connexion au printemps? Lorsque l'URL restreinte contient/fr utilisateur doit être redirigé vers/fr/page de connexion (en anglais) sinon si la page a les paramètres régionaux par défaut, rediriger vers/login url (avec la langue par défaut)

Répondre

0

dans la sécurité spirale que vous pouvez utiliser ce

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 
    } 
    } 

et mettre à jour votre configuration comme ceci:

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

Merci Hicham mais si je comprends bien, votre réponse se rapporte à l'endroit où rediriger l'utilisateur après une authentification réussie. Je dois le faire de manière opposée: à quelle page de connexion envoyer l'utilisateur pour faire leur authentification. – pszkv

0

En attendant, je trouve cette solution. Peut-être que ce n'est pas parfait mais ça marche.

@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() 
    } 
}