Весенняя безопасность. Многоязычная страница входа на основе 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() } } 
Intereting Posts
Как я могу называть класс java как A: extends B реализует C в kotlin Kotlin REST для машинописных определений Преобразование байт-массива в строку в Kotlin Как элегантная пара родительского и дочернего тегов в определении DSL в Kotlin Ошибка «Нет определения класса def» при использовании OpenAM SDK через Kotin Как использовать TypeToken + generics с Gson в Kotlin Как использовать Kotlin coroutines wait () в главной теме Ссылка на значения и методы вызова в типах общих типов Критерии запроса для сопоставления 3 из 6 полей Kotlin – Идиоматический способ проверки массива содержит значение Gradle. Котлин – возможно ли создать динамические задачи («на лету»)? Почему я получаю сообщение об ошибке «Смарт-бросок в« Лонг »невозможно» в Котлине? Но это нормально в java? Как запустить торнадо fx привет мир с java 7 Как сделать аргумент по умолчанию? Что не так с использованием инсталляции setter для Android ViewModel против внедрения и ввода ViewModel.Factory?