如何加入Spring Security身份验证过程?

时间:2018-10-12 16:36:37

标签: spring spring-security kotlin

目前,我的配置很简单:

TrapHouseVersion

如果身份验证失败,我有两个要求:

  1. 将Flash错误消息发送到会话中(避免查询字符串中的“错误”参数)。看来我无法将// Kotlin code override fun configure(http: HttpSecurity) { http .formLogin() .loginPage("/entry") .loginProcessingUrl("/auth") .usernameParameter("usr") .passwordParameter("pwd") .defaultSuccessUrl("/", true) .failureHandler { request, response, exception -> // Can't figure out what to enter here (see below). } } 注入此lambda中;有解决方法吗?

  2. 我想发回用户在提交登录表单之前输入的登录名(而不是密码),以便重新填充该字段。我该怎么办?

1 个答案:

答案 0 :(得分:1)

我能够弄清楚。

@Configuration
@EnableWebSecurity
class SecurityConfig: WebSecurityConfigurerAdapter() {
    override fun configure(http: HttpSecurity) {
        http
            .formLogin()
            .loginPage("/entry")
            .loginProcessingUrl("/auth")
            .usernameParameter("usr")
            .passwordParameter("pwd")
            .defaultSuccessUrl("/", true)
            .failureHandler { request, response, _ ->
                request.session.setAttribute("loginError", "Login Error!")
                request.session.setAttribute("failedUsername", request.getParameter("usr"))
                response.sendRedirect("/entry")
            }
    }
}

然后,您必须设置登录控制器以自定义登录表单的服务:

@Controller
@RequestMapping("/entry")
internal class LoginController {
    @GetMapping
    fun getLoginForm(session: HttpSession, model: Model): String {
        if (session.getAttribute("loginError") != null) {
            model.addAttribute("loginError", "Login Error!")
            session.removeAttribute("loginError")
            model.addAttribute("failedUsername", session.getAttribute("failedUsername"))
            session.removeAttribute("failedUsername")
        }
        return "login"
    }
}

然后,您可以在模板中使用loginErrorfailedUsername模型属性:

<div th:if="${loginError}">Incorrect login/password</div>
<!-- ... -->
<input type="text" name="usr" th:value="${failedUsername}">

基本上,我们正在将“闪烁”消息模拟为会话。我们在会话中携带这些消息,并在将其读取并传递到模型后立即将其删除。重定向可能会出错,并且消息将保留在会话中,但是它们本身无害,并且下次用户访问/entry页面时也会将其删除。

结果,现在页面URL中没有?error,并且不需要用户重新输入用户名。