小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
写在前面
本文将继续学习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() 方法的执行效果就是提供了一个默认的登录界面,如下所示:
我们已经在上一讲中看到过这个登录界面。对于登录操作而言,这个登录界面通常都是定制化的,同时,我们也需要对登录的过程和结果进行细化控制。此时,我们就可以通过如下所示的配置内容来修改系统的默认配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginPage("/login.html")//自定义登录页面
.loginProcessingUrl("/action")//登录表单提交时的处理地址
.defaultSuccessUrl("/index");//登录认证成功后的跳转页面
}
可以看到,这里我们对登录界面、登录请求处理地址以及登录成功后的跳转界面进行了定制化。
总结
本文我们介绍了如何使用 Spring Security 构建用户认证体系的系统方法。在 Spring Security 中,认证相关的功能都是可以通过配置体系进行定制化开发和管理的。通过简单的配置方法,我们可以组合使用 HTTP 基础认证和表单登录认证
好了 今天就讲到这里,下一期我们讲解用户认证体系。
弦外之音
感谢你的阅读,如果你感觉学到了东西,麻烦您点赞,关注。也欢迎有问题我们下面评论交流
加油! 我们下期再见!
给大家分享几个我前面写的几篇骚操作