阅读 SpringSeccurity 源码—理解登录表单传参名默认是 username 和 password

简介: 阅读 SpringSeccurity 源码—理解登录表单传参名默认是 username 和 password

image.png

相信有不少同学再刚接触 SpringSeccurity ,进行自定义登录页面时,当输入正确的用户名密码后但是提交一直提交不到登录逻辑的现象,那么有可能就是你的前台登录表单中设置的参数值名不对。

下面是一个非常简单的登录表单。我已经将两个参数值的 name 设置为 usernamepassword

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>登录</title></head><body><!--登录表单--><formaction="/login"method="post"><label>用户名:<inputname="username"type="text"></label><br/><label>密码:<inputname="password"type="text"></label><br/><inputtype="submit"value="登录"></form></body></html>

登录表单中的 name 值必须为:usernamepassword,这两个参数名要跟UsernamePasswordAuthenticationFilter中的设置要一样,否则接收不到。

那么为什么要这么设置呢?上源码


我们主要查看 SpringSeccurity 下的 UsernamePasswordAuthenticationFilter类的 attemptAuthentication()方法。

@OverridepublicAuthenticationattemptAuthentication(HttpServletRequestrequest, HttpServletResponseresponse)
throwsAuthenticationException {
//如果只允许 POST 请求或者请求方式不是 POST 方式时,抛异常if (this.postOnly&&!request.getMethod().equals("POST")) {
thrownewAuthenticationServiceException("Authentication method not supported: "+request.getMethod());
    }
//通过 obtainUsername() 方法获取 request 域中的 username 值Stringusername=obtainUsername(request);
username= (username!=null) ?username : "";
username=username.trim();
//通过 obtainPassword() 方法获取 request 域中的 password 值Stringpassword=obtainPassword(request);
password= (password!=null) ?password : "";
UsernamePasswordAuthenticationTokenauthRequest=newUsernamePasswordAuthenticationToken(username, password);
// Allow subclasses to set the "details" propertysetDetails(request, authRequest);
returnthis.getAuthenticationManager().authenticate(authRequest);
}

我们查看 obtainUsername()方法可以看出来就是一个非常简单的 request.getParameter()方法。

@NullableprotectedStringobtainUsername(HttpServletRequestrequest) {
returnrequest.getParameter(this.usernameParameter);
}

同理,obtainPassword()也是一个非常简单的 request.getParameter()方法。

@NullableprotectedStringobtainPassword(HttpServletRequestrequest) {
returnrequest.getParameter(this.usernameParameter);
}

那么 request.getParameter()需要的参数 usernameParameterusernameParameterUsernamePasswordAuthenticationFilter类的刚开始时已经赋值为 usernamepasswordabc3f9c31ffdd1680c432c1257bc2618.png

看到这里已经不难明白,其实 Spring 就是通过 request 域中 username和 password的值来获取我们输入的用户名密码。如果前台登录表单参数名不是 username和 password,那自然获取不到,就会一直登录不了。

录表单参数名不是 username和 password,那自然获取不到,就会一直登录不了。


那么如何改成我们自己设置的参数名呢?

很简单,我们只需要在 SpringSecurityConfig配置类中设置usernameParameterpasswordParameter即可。

@Overrideprotectedvoidconfigure(HttpSecurityhttp) throwsException {
//表单登录http.formLogin()
//自定义登录页面        .loginPage("/login.html")
//自定义登录逻辑        .loginProcessingUrl("/login")
//登陆成功后跳转页面,必须是 POST 方式        .successForwardUrl("/toMain")
//登录失败后跳转到错误页面,必须是 POST 方式        .failureForwardUrl("/toError")
//设置参数名        .usernameParameter("username123")
        .passwordParameter("password123");
}
目录
相关文章
|
5月前
|
Java 数据安全/隐私保护
JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。
该博客文章通过JavaBean组件和JSP动作元素`<jsp:forward>`与`<jsp:param>`的使用示例,演示了用户登录流程,包括登录信息的提交、验证以及根据验证结果进行的页面跳转。
JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。
|
8月前
BurpSuite8.2 -- 查找包含id参数的URL
BurpSuite8.2 -- 查找包含id参数的URL
75 1
|
4月前
|
JavaScript 前端开发 安全
php学习笔记-普通表单参数提交获取及页面的重定向和一个登录小demo-day05
本文介绍了PHP中普通表单参数的提交获取、页面重定向的方法,并通过一个登录示例演示了表单参数的封装和页面跳转处理。
|
5月前
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
6月前
|
前端开发 PHP 数据格式
​超简单实现联系表单Contact Form自动发送邮件
构建网站联系表单以自动发送邮件的简单方法包括创建HTML表单和PHP处理脚本。HTML表单收集姓名、邮箱、主题和消息,提交至`send_mail.php`。PHP脚本接收数据,使用`mail()`函数发送邮件到指定地址。要确保服务器支持PHP邮件功能,并可能需调整SMTP设置以避免垃圾邮件过滤。可优化点包括使用SMTP服务器、增加表单验证和采用HTML邮件模板。
location search 属性获取登录用户名
location search 属性获取登录用户名
50 1
移除MagenTo自动发送邮件中网址的多余部分?___store=id
移除MagenTo自动发送邮件中网址的多余部分?___store=id
|
JavaScript
(巨好使,详细,解析URl,URl自定义传参)js URl中快速自定义传参,并且实现参数解析 修改 和新增,替换功能
我们在日常开发中经常会遇到要对url中的参数进行修改和新增,但是自己手动每次敲就会导致代码很麻烦,且不易维护
354 0
(巨好使,详细,解析URl,URl自定义传参)js URl中快速自定义传参,并且实现参数解析 修改 和新增,替换功能
|
PHP
laravel-admin 自定义登陆逻辑,补充原有账号密码登录
laravel-admin 自定义登陆逻辑,补充原有账号密码登录
369 0
|
数据库 SQL
用户 'XXX\SERVERNAME$' 登录失败。 原因: 找不到与提供的名称匹配的登录名。 [客户端: ]
原文:用户 'XXX\SERVERNAME$' 登录失败。 原因: 找不到与提供的名称匹配的登录名。 [客户端: ] 一工厂的中控服务器遇到了下面Alert提示,'XXX\SERVERNAME$'  XXX表示对应的域名, SERVERNAME$(脱敏处理,SERVERNAME为具体的服务器名称+$),而且如下所示,客户端是本机,研究了一下,才搞清楚具体原因.       日期/时间:  2017/6/20 12:24:51   说明:   用户 'XXX\SERVERNAME$' 登录失败。
1478 0