Spring Security入门到实践(二)表单认证实践及原理分析

本系列文章第一篇《Spring Security入门到实践(一)小试牛刀》从最简单的Spring Security入门案例开始展开,分析了HTTP Basic在Spring Security中的应用原理以及部分源码。本篇文章将从最常用的认证方式——表单认证开始,着重分析Spring Security的表单认证的基本原理。

一、表单登录的默认行为分析

登录认证功能是我们在日常生活中使用到最多的功能之一,现在互联网应用基本都具备表单登录能力,基本的思路都是当用户访问一个需要登录后才能访问的功能,应用会提示用户没有登录,从而跳转到登录页面进行登录,登录成功之后,会自动跳转回原来访问的功能或者资源。对于现在前后端分离的应用而言,一般用户登录成功之后跳转到原来的页面还是进入到用户个人中心,一般都是由前端来决定,前端发起登录请求,后端校验用户提供的用户名和密码,如果正确,前端将拿到后端提供的用户认证信息和权限列表,由前端根据用户信息来决定下一步该如何进行。

从第一篇文章我们就知道,关于Spring Security的相关自定义配置,都需要在WebSecurityConfigurerAdapter及其子类中配置,那么这里我们来做一下基于用户名和密码的表单认证基本配置。我们编写一个配置类WebSecurityConfig来继承WebSecurityConfigurerAdapter,并重写configure(HttpSecurity http)方法,具体代码如下所示:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .and()
            .csrf().disable();
    }

}

这段配置重写了WebSecurityConfigurerAdapter中的默认配置,这里没有再配置HTTP Basic认证了,也关闭了csrf防护。这段简单的配置就可以用来分析表单登录认证的基本原理。

启动项目,访问需要认证后才能访问的http://localhost:8080/demo路由,果然,页面自动跳转到了登录页面,如图所示:
ncEBGQ.jpg
也就是说需要我们登录后才可以继续访问到http://localhost:8080/demo,从当前的登录页面我们无法得知填写的用户名和密码是以什么参数名的值提交到后台,后台处理当前提交数据的URL也无法看出,其实,我们可以通过查看当前页面的源码,就一目了然了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHwpPPWP-1571892234046)(https://s2.ax1x.com/2019/10/02/udplM8.jpg)]

从上图中的页面代码可以看出,form表单是提交到了/login路由进行登录处理的,用户名和密码的表单名称分别为username和password。我们输入已经在application.properties中配置好的用户名和密码(user/123456),成功跳转到了/demo路由,并返回了"Welcome to learn Spring Security!"提示信息。

分析上面的行为,首先是我们访问了/demo路由,而这个路由需要登录后才可以访问,所以在尚未登录的情况下访问/demo路由,直接跳转到了Spring Security默认的登录页面,输入了正确的用户名和密码后,在后台得到了验证,就跳转到了/demo路由并返回预期信息。那么这一默认行为是如何实现的呢?在接下来的小节中,我们通过阅读源码来了解这一默认行为的原理。

二、表单登录核心源码分析

经过第一小节的表单登录的默认行为分析,我们对整个过程是很容易理解的,但是如果仅仅停留在过程理解上,那么我们很难真正地掌握Spring Security的精妙之处,所以本小节将着重从源码分析的角度来分析这一默认行为过程,在分析之前,我们一起来对接下来的分析提出几个问题,我们带着问题去源码中寻找答案。

  • Spring Security是如何知道我们访问的路由/demo是必须登录后才可以访问的?
  • Spring Security是如何拦截我们的请求并分析到我们当前的访问是在未登录的情况下进行访问的?
  • Spring Security在发现我们尚未登录的情况下,是如何引导我们进入到了它的默认登录页面?
  • Spring Security是如何处理我们提交的用户名和密码的?
  • Spring Security是如何在我们提供了正确的用户名和密码的情况下,将我们重新引导到/demo路由?

如果我们在阅读源码的过程中解决了这几个问题,那么我们算是真正地理解了Spring Security的表单登录原理,在理解了原理之后,我们就可以根据自己项目的需求来定制化开发表单登录功能。话不多说,请抓紧上车,我们一同驶向胜利的彼岸。

发布了73 篇原创文章 · 获赞 84 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/Lammonpeter/article/details/102720892