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

2021/12/20 1:20:32

本文主要是介绍阅读 SpringSeccurity 源码—理解登录表单传参名默认是 username 和 password,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1364531215643521_画板 1

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

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

<!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 值必须为:usernamepassword,这两个参数名要跟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()需要的参数 usernameParameterusernameParameterUsernamePasswordAuthenticationFilter类的刚开始时已经赋值为 usernamepassword

image-20211219225134249

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



这篇关于阅读 SpringSeccurity 源码—理解登录表单传参名默认是 username 和 password的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程