春季安全。基于url的多语言登录页面

时间:2017-10-09 03:25:12

标签: spring spring-mvc spring-boot spring-security kotlin

我在Spring Boot应用程序中将locales作为url的一部分:

/ site - 默认语言环境

/ en / site - 英语区域设置

我使用自定义拦截器:

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中处理两个自定义登录页面的最佳方法是什么?当受限制的url包含/ en用户应重定向到/ en / login页面(使用英语),否则如果页面具有默认语言环境,则应重定向到/ login url(使用默认语言)

2 个答案:

答案 0 :(得分:0)

在spiring安全性中你可以使用这个

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

答案 1 :(得分: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()
    }
}