Весенняя безопасность. Многоязычная страница входа на основе URL

У меня есть локали как часть URL-адреса в приложении Spring Boot:

/ site – default locale

/ ru / сайт – Английский язык

Для этого я использую специальный перехватчик:

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

}

Вопрос в том, как лучше всего обрабатывать две пользовательские страницы входа весной? Когда ограниченный url содержит / en, пользователь должен быть перенаправлен на страницу / en / login (с английским языком), иначе, если страница имеет локаль по умолчанию, она должна быть перенаправлена ​​на / login url (с языком по умолчанию)

в обеспечении безопасности вы можете использовать это

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

Тем временем я нашел это решение. Возможно, это не идеально, но это работает.

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