阅读 SpringSeccurity 源码—理解登录表单传参名默认是 username 和 password
2021/12/20 1:20:32
本文主要是介绍阅读 SpringSeccurity 源码—理解登录表单传参名默认是 username 和 password,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
相信有不少同学再刚接触 SpringSeccurity ,进行自定义登录页面时,当输入正确的用户名密码后但是提交一直提交不到登录逻辑的现象,那么有可能就是你的前台登录表单中设置的参数值名不对。
下面是一个非常简单的登录表单。我已经将两个参数值的 name 设置为 username
和 password
。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <!--登录表单--> <form action="/login" method="post"> <label>用户名:<input name="username" type="text"></label> <br/> <label>密码:<input name="password" type="text"></label> <br/> <input type="submit" value="登录"> </form> </body> </html>
登录表单中的 name 值必须为:username
和 password
,这两个参数名要跟UsernamePasswordAuthenticationFilter
中的设置要一样,否则接收不到。
那么为什么要这么设置呢?上源码。
我们主要查看 SpringSeccurity 下的 UsernamePasswordAuthenticationFilter
类的 attemptAuthentication()
方法。
@Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { //如果只允许 POST 请求或者请求方式不是 POST 方式时,抛异常 if (this.postOnly && !request.getMethod().equals("POST")) { throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); } //通过 obtainUsername() 方法获取 request 域中的 username 值 String username = obtainUsername(request); username = (username != null) ? username : ""; username = username.trim(); //通过 obtainPassword() 方法获取 request 域中的 password 值 String password = obtainPassword(request); password = (password != null) ? password : ""; UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); // Allow subclasses to set the "details" property setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); }
我们查看 obtainUsername()
方法可以看出来就是一个非常简单的 request.getParameter()
方法。
@Nullable protected String obtainUsername(HttpServletRequest request) { return request.getParameter(this.usernameParameter); }
同理,obtainPassword()
也是一个非常简单的 request.getParameter()
方法。
@Nullable protected String obtainPassword(HttpServletRequest request) { return request.getParameter(this.usernameParameter); }
那么 request.getParameter()
需要的参数 usernameParameter
和 usernameParameter
在 UsernamePasswordAuthenticationFilter
类的刚开始时已经赋值为 username
,password
。
看到这里已经不难明白,其实 Spring 就是通过 request 域中 username
和 password
的值来获取我们输入的用户名密码。如果前台登录表单参数名不是 username
和 password
,那自然获取不到,就会一直登录不了。
这篇关于阅读 SpringSeccurity 源码—理解登录表单传参名默认是 username 和 password的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?