开发者学堂课程【Spring Boot 2.5.x 开发实战:7.0Spring Boot2.5安全机制与 API 身份验证实战】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/853/detail/14072
7.0Spring Boot2.5安全机制与 API 身份验证实战
内容介绍:
一、本节课程介绍
二、Java Spring Boot 2.5安全机制
三、Java 面试题
一、本节课程介绍
在 Spring Boot 中实现了安全机制,Spring Boot 可以对接各种不同的安全框架,也可以自定义实现比较原始的安全机制。
本节课会模拟一个简单的 rest API 项目,然后对其启用身份验证。这里可以进行扩展,对接 MySQL 数据库甚至 Redis 缓存来实现整个用户的注册和身份验证整个过程。(大型项目,例如淘宝、微信或者新浪微博,其身份验证在 Release 中进行,因为用户规模大,并且信息在分布式缓存中进行保存)后面可以扩展到 Release 身份验证机制,把身份验证与 Release 和 MySQL 结合起来,实现一个完整的项目。
二、Java Spring Boot 2.5安全机制
1.Java Spring Boot 2.0安全机制
(1)自定义实现安全验证
(2)Apache Shiro 开源框架
(3)Spring Security 开源框架
(4)大量使用 AOP
(5)依赖注入思想
(6)灵活扩展
Spring Boot提供的安全机制,可以用Spring Security 开源框架,也可以用 Apache Shiro 开源框架,还可以用自定义实现安全验证。
web 开发底层本质上是 web 请求进入 web 框架,请求可以拦截。也可以叫 AOP 编程,做拦截和身份校验的工作(拦截可以进行授权)。
Spring Boot 作为快速开发框架,其底层有 web 开发的接口(可以做 API 应用等等)
2.Java Spring Boot 2.5安全机制
可以进行授权,定了一些角色,设置对应的权限,这里支持的方式很多。Spring Boot 作为快速开发框架,底层有 Web 开发的接口,可以做网站、 API 应用、定时任务应用等等。
目前应用程序身份验证的类型非常多,不仅有基于网页的 Form 表单验证,也有 Basic 等等(如下图)
还有企业级身份验证,比如基于企业局域网的客户身份验证,组织内部使用的身份验证。还有跨第三方平台的开放式身份验证体系等。
3. 安全漏洞
注意:基于 Spring Boot 开发尽量用较新版本,最好是Spring Boot2.3以上的版本,不要用太老的版本。Spring Boot 2020年9月份又修复了一批安全漏洞,涉及到远程代码过程执行的安全漏洞问题。
总结:
(1) Spring Boot 2020年9月份修复漏洞
(2) Spring Boot Actuator 未授权访问远程代码执行漏洞
(3)紧急修复 Spring Framework 版本包含一个安全漏洞( CVE-
2020-5421)的修复程序。此漏洞可以通过 sessionld 绕过 RFD (反射型文件下载)保护
(4)Spring Boot 2018 年修复了一些安全漏洞
(5)建议使用最新的Spring 5.0+版本
(6)Spring框架升级5.0.o - 5.0.2
(7)Spring框架升级4.3.0 - 4.3.13
(8)Spring Boot 1.5.10
4. Java Spring Security
安全框架本身相对成熟,可以集成 Spring Security,也可以集成Spring MVC ,也可以集成 Spring Boot ,也可以集成 Spring cloud。
保护 Spring 应用系统的安全标准,可以实施各种产同的身份验证,可以做各种数据源进行集成,定制开发工作,包括基于角色、基于令牌都可以实现。这种多种身份验证机制的支持,包括扩展 URL 、自定义路由规则,这种方法的验证都可以进行实现。这种框架方便构建安全体系,不会限制应用程序的类型。整个集成和 Spring 应用平台集成最好。
总结:
(1)Spring Security 功能强大且高度可自定义的安全框架。
(2)保护 spring 应用系统的安全标准。
(3)Spring Security 专注于身份验证和授权。
(4)容易地扩展、自定义开发
(5)前身是 Acegi Security ,
(6)提供安全认证服务的框架。
(7)Spring Security 为基于 J2EE 企业应用提供了全面安全机制。
(8)Authentication 验证和 Authorization 授权
(9)抵御会话攻击,点击劫持,CSRF 跨站请求伪造。
该框架方便构建自己的安全体系,不会限制应用程序的类型。
5.Java 安全框架 Shiro
Apache 官网有一个开源的项目叫 Apache Shiro,是一个开源的安全管理,支持的工作非常强大,唯一的差别是不属于 Spring 官方。但是很好用,有很多项目包括 Spring Boot,甚至 Spring Cloud都在使用 Apache Shiro 。对接不同的数据源,两个都可以,取决于个人倾向,两个都非常完善,正常情况下,如果希望技术上简单一点,可以直接使用一整套 SpringJava 安全框架
Shiro 总结:
(1)Apache Shiro 简单易用的开源 Java 安全框架
(2)轻松实现身份验证、授权、加密和会话管理。
(3)使用 Shiro 可以快速实现系统安全。
(4)Shiro 其前身是J security 项目
(5)Shiro 可以轻易实现 Java 网站安全验证
(6)可应用于 Web 环境,非 Web 环境
(7)支持多种数据源 MySQL 等
(8)如 LDAP,JDBC,Kerberos,ActiveDirectory 等
6. Spring Security Demo
加一个入门的 spring-boot-starter- security 依赖,然后拉取必要的安全组件。
<dependencies>
…
<dependency>
<groupld>org.springframework.boot</groupld>
<artifactld>spring-boot-starter- security</artifactld>
</dependency>
…
</dependencies>
7.WebSecurityConfig
(1)Spring Security 的配置类
(2)WebSecurityConfig
(3)可以配置安全规则
(4)默认启用 basic 验证
(5)#Spring Security 可以在配置文件中关闭
(6) security.basic.enabled = false
在早期版本中可以自行选择开放及关闭安全认证,现版本默认启用。可以直接设置Spring Security配置文件注入必要安全配置规则,例如某路由规则、针对主页等,甚至加入角色限制。
Web 全站安全验证配置
下面这段代码,是 Web 全站安全验证配置的例子,针对 anyRequest
定制时,所有的请求都做身份验证。 hasRole 表示针对当前的请求
访问某个地址,或者所有的请求访问时是否具备某个角色(这个角色或者权限的验证,需要定制扩展接口),比如连数据库或者连缓存,实现角色查询,需要有校验。
@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER: 10)
public class ApplicationConfigurerAdapter extendsWebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception
{
http.antMatcher(" /admin/**")
.authorizeRequests()
.antMatchers("/admin/users").hasRole(“usersAdmin")
.antMatchers("/admin/orders").hasRole( "ordersAdmin")
.anyRequest().isAuthenticated
(
);
}
}
8.重新实现验证机制
有一般规则,就有特殊规则,允许自定义扩展底层的 API 实现自定义的判断逻辑,这是良好的安全框架所具备的功能。
重新实现验证机制:
• WebSecurityConfig 安全配置类;
• UserDetailsService 接口。
实践案例演示:
这个程序是之前的 Web 网站,看一下项目的依赖,通过文件依赖可以看出,相比之前的项目,如果数据库依然存在,还是用之前的spring data jpa ,加入 MySQL 的数据库的链接。
稍微注意一下,这里面有个 starter security,加完以后,可以看一下左边的依赖包的安全组件,有包括 spring security config 、spring security core、spring security web 等。
代码具体的配置和实现:
新版本默认已经集成,现在最主要的要有 Web 安全配置,全局配置的时候使用内存验证,实际可以对接数据库、对接缓存。当前程序的进程里面写了用户名“frankxu”,密码“1234qwer”,这种方式并不提倡。
正常情况下,可以定义特殊规则“configuer”,针对 rize 请求,可以匹配首页,允许首页所有的人都可以访问;
针对 user,做身份验证。也可以提供表单的登录模式“formLogin()”。做这个例子,是提供这种访问 HOME 可以不做身份验证的方法,可以直接进入。
查询数据库 Get all,演示在浏览器输入“localhost:8081”,启动网址,会发现一个问题,访问一个接口时,比如 user 查看所有用户,会自动跳转到“login”。当请求一个地址的时候,发现不是可忽略的地址,会自动拦截,跳转到登录界面,这个登录界面是基于表单。
这时会要求输入用户账号和密码,用户账号和密码是定义死的。
之前已经测试过了,点击登录,“Users/gerAll”可以访问
如上图所示,出现了3个账号和密码,这3个账号全部返回。这里还有别的接口,“GetById”
测试一下,输入“GetById/1”,返回 ID 为1的账号和密码:
三、Java 面试题
1.本质:URL,拦截请求,验证,放行或者拒绝
注意规则的顺序,正常的项目,会有一个访问,并且有拦截请求操作,安全机制本质上是拦截请求,基于 URL 规则,判断请求是不是要拦截,验证,然后放行或者拒绝。验证过程,可以调用缓存或数据库实现安全验证规则。
2. Java Spring Security 安全机制;
3. 如何扩展使用 Token 令牌验证;
4. JWT 开源安全令牌组件;
5. 如何支持 X509 正式验证;
6. 自定义实现 Spring Boot 2.5.x 身份验证;
7. API 安全如何实现;
8. SSO 单点登录怎么实现?
9. 微服务 Spring Cloud 安全体系;
10. 转 Java ,跳槽一线互联网公司。