Spring Security专栏(如何利用Spring Security搭建用户体系)

1,527 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

写在前面

本文将继续学习Spring Security ,本文首先要讨论的就是用户认证功能。用户认证涉及用户账户体系的构建,也是实现授权管理的前提。在 Spring Security 中,实现用户认证的方式有很多,我将通过几篇文章,分开讲解,讲太多,效率也不会太高,所以我将片化作点,各个击破。

Spring Security 配置体系

在 Spring Security 中,因为认证和授权等功能通常都不止有一种实现方法,所以框架开发了一套完整的配置体系来对这些功能进行灵活设置。

在日常开发中,通常不需要我们自己实现这个接口,而是使用 WebSecurityConfigurerAdapter 类来简化该配置类的使用方式。而在 WebSecurityConfigurerAdapter 中我们发现了如下所示的 configure 方法:

protected void configure(HttpSecurity http) throws Exception {
 
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin().and()
            .httpBasic();
}

上述代码就是 Spring Security 中作用于用户认证和访问授权的默认实现,这里用到了多个常见的配置方法。再次回想上一讲中我们讲到的,一旦在代码类路径中引入 Spring Security 框架之后,访问任何端点时就会弹出一个登录界面用来完成用户认证。认证是授权的前置流程,认证结束之后就可以进入到授权环节。

我们对上述方法进行下简单分析,看看这种默认配置是如何实现的

  • 首先,通过 HttpSecurity 类的 authorizeRequests() 方法对所有访问 HTTP 端点的 HttpServletRequest 进行限制;

  • 然后,anyRequest().authenticated() 语句指定了对于所有请求都需要执行认证,也就是说没有通过认证的用户就无法访问任何端点;

  • 接着,formLogin() 语句用于指定使用表单登录作为认证方式,也就是会弹出一个登录界面

  • 最后,httpBasic() 语句表示可以使用 HTTP 基础认证(Basic Authentication)方法来完成认证。

所以说,在日常开发过程中,我们可以继承 WebSecurityConfigurerAdapter 类并且覆写上述的 configure() 方法来完成配置工作。而在 Spring Security 中,存在一批类似于 WebSecurityConfigurerAdapter 的配置类。

实现 HTTP 基础认证和表单登录认证

HTTP 基础认证

在上文中,我们提到了 httpBasic() 和 formLogin() 这两种用于控制用户认证的实现手段,分别代表了HTTP 基础认证和表单登录认证

HTTP 基础认证的原理比较简单,只需通过 HTTP 协议的消息头携带用户名和密码进行登录验证

我们直接访问 http://localhost:8080/hello 会得到如下所示的响应:

{
    "timestamp""2021-10-25T03:45:21.512+00:00",
    "status"401,
    "error""Unauthorized",
    "message""",
    "path""/hello"
}

显然,响应码 401 告诉我们没有访问该地址的权限。同时,在响应中出现了一个“WWW-Authenticate”消息头,其值为“Basic realm="Realm"”,这里的 Realm 表示 Web 服务器中受保护资源的安全域。

当然,想要在应用程序中启用 HTTP 基础认证还是比较简单的,只需要在WebSecurityConfigurerAdapter 的 configure 方法中添加如下配置即可:

protected void configure(HttpSecurity http) throws Exception {
 
        http.httpBasic();
}

HTTP 基础认证比较简单,没有定制的登录页面,所以单独使用的场景比较有限。在使用 Spring Security 时,我们一般会把 HTTP 基础认证和接下来要介绍的表单登录认证结合起来一起使用。

表单登录认证

在 WebSecurityConfigurerAdapter 的 configure() 方法中,一旦配置了 HttpSecurity 的 formLogin() 方法,就启动了表单登录认证,如下所示:

protected void configure(HttpSecurity http) throws Exception {
 
        http.formLogin();
}

formLogin() 方法的执行效果就是提供了一个默认的登录界面,如下所示:

image.png

我们已经在上一讲中看到过这个登录界面。对于登录操作而言,这个登录界面通常都是定制化的,同时,我们也需要对登录的过程和结果进行细化控制。此时,我们就可以通过如下所示的配置内容来修改系统的默认配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
	 
    http
        .formLogin()        
        .loginPage("/login.html")//自定义登录页面
        .loginProcessingUrl("/action")//登录表单提交时的处理地址
        .defaultSuccessUrl("/index");//登录认证成功后的跳转页面        
}

可以看到,这里我们对登录界面、登录请求处理地址以及登录成功后的跳转界面进行了定制化。

总结

本文我们介绍了如何使用 Spring Security 构建用户认证体系的系统方法。在 Spring Security 中,认证相关的功能都是可以通过配置体系进行定制化开发和管理的。通过简单的配置方法,我们可以组合使用 HTTP 基础认证和表单登录认证

好了 今天就讲到这里,下一期我们讲解用户认证体系。

弦外之音

感谢你的阅读,如果你感觉学到了东西,麻烦您点赞,关注。也欢迎有问题我们下面评论交流

加油! 我们下期再见!

给大家分享几个我前面写的几篇骚操作

聊聊不一样的策略模式(值得收藏)

copy对象,这个操作有点骚!