哈喽各位同学们大家好呀,提前祝同学们端午节安康🎇!今天小编为大家分享开发者学院中课程“Spring Boot2.5安全机制与 REST API身份验证实战 ”干货总结哦~Spring Boot 2.5.x开发实战可是Java中级工程师必备课程!
课程链接以及图谱地址小编已经为大家指路了,搭配学习效果更佳👇
课程名称:Spring Boot 2.5.x开发实战
课程地址:https://developer.aliyun.com/learning/course/71
图谱名称:Alibaba Java 技术图谱
图谱地址:https://developer.aliyun.com/graph/java
Spring Boot2.5安全机制与 REST API身份验证实战
一、Java Spring Boot 2.5安全机制
本节课讲的是应用程序安全问题,在Spring Boot体系里,提供了一套安全机制,可以对接各种不同的安全框架,包括自定义实现原始的身份验证机制。
模拟简单的REST API项目,启用身份验证,进行扩展对接MySQL数据库,甚至对接Release缓存,实现整个用户的注册和身份验证过程。
但大型项目,比如淘宝、微信、新浪微博的账号验证基本上都在Release里面进行,用户的规模比较大,而且整个的用户会话信息,要在分布式缓存里面进行保存。后面可以扩展到Release身份验证机制,把身份验证与Release和MySQL结合起来,实现一个完整的项目。
(一)Java Spring Boot 2.0安全机制
Spring Boot提供的安全机制,可以用Spring Security 开源框架,也可以用Apache Shiro 开源框架,还可以用自定义实现安全验证。Web框架开发底层本质上是Web请求进入Web框架,然后可以拦截,这里也叫AOP编程,用于做拦截,做身份验证的工作。总结:
1. 自定义实现安全验证;
2. Apache Shiro 开源框架;
3. Spring Security 开源框架;
4. 大量使用AOP;
5. 依赖注入思想;
6. 灵活扩展。
(二)Java Spring Boot 2.5安全机制
也可以进行授权,定了一些角色,设置对应的权限,这里支持的方式很多。Spring Boot作为快速开发框架,底层有Web开发的接口,可以做网站、 API应用、定时任务应用等等。
目前应用程序身份验证的类型非常多,不仅基于网页的Form表单验证、Basic、摘要身份验证、令牌身份验证,令牌身份验证主要是用在REST API,包括一些大型的微服务架构程序中。当然还有企业级身份验证,比如基于企业局域网的客户身份验证,组织内部使用的身份验证。还有跨第三方平台的开放式身份验证体系等。
(三)安全漏洞
后续基于Spring Boot进行开发,尽量升级到比较新的版本,最好是Spring Boot2.3以上的版本,不要用太老的版本。Spring Boot 2020年9月份又修复了一批安全漏洞,涉及到远程代码过程执行的安全漏洞问题。
安全漏洞建议总结:
1. Spring Boot 2020年9月份修复漏洞;
2. Spring Boot Actuator 未授权访问远程代码执行漏洞;
3. 紧急修复 Spring Framework 版本包含一个安全漏洞(CVE-2020-5421)的修复程序。此漏洞可以通过 sessionId 绕过RFD (反射型文件下载)保护;
4. Spring Boot 2018年修复了一些安全漏洞;
5. 建议使用最新的Spring 5.0+版本;
6. Spring 框架升级 5.0.0 - 5.0.2;
7. Spring 框架升级 4.3.0 - 4.3.13;
8. Spring Boot 1.5.10。
(四)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跨站请求伪造。
(五)Java安全框架Shiro
Apache 官网有一个开源的项目叫Apache Shiro,是一个开源的安全管理,支持的工作非常强大,唯一的差别是不属于Spring官方。但是很好用,有很多项目包括Spring Boot,甚至Spring Cloud都在使用Apache Shiro。对接不同的数据源,两个都可以,取决于个人倾向,两个都非常完善,正常情况下,如果希望技术上简单一点,可以直接使用一整套Spring。Java安全框架Shiro总结:
1. Apache Shiro简单易用的开源Java安全框架;
2. 轻松实现身份验证、授权、加密和会话管理;
3. 使用Shiro可以快速实现系统安全;
4. Shiro其前身是Jsecurity项目;
5. Shiro可以轻易实现Java网站安全验证;
6. 可应用于Web环境,非Web环境;
7. 支持多种数据源MySQL等;
8. 如LDAP,JDBC,Kerberos,ActiveDirectory等)。
二、Java Spring Boot 2.5安全实战
(一)Spring Security Demo
在之前的WEB架构基本上,可以加入门的starter-security的依赖,入完以后,会提供必要的安全组件,默认的就是security组件,当然也可以替换,两个都可以配置。实现代码如下:
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId> spring-boot-starter-security </artifactId>
</dependency>
...
</dependencies>
(二)WebSecurityConfig
早期的Spring1.x几版本中,需要自己显示去关闭或者开放安全验证,现在的基本上默认是已经启动了。可以直接设置WebSecurityConfig配置文件,注入必要的安全配置规则,比如基于某个内路由规则、针对order订单的身份验证等,甚至加入角色的限制都可以实现,提供了强大的规则。
WebSecurityConfig总结:
1. Spring Security的配置类;
2. WebSecurityConfig;
3. 可以配置安全规则;
4. 默认启用basic验证;
5. # Spring Security可以在配置文件中关闭;
6. security.basic.enabled = false。
(三)Web全站安全验证配置
下面这段代码,是Web全站安全验证配置的例子,针对anyRequest定制时,所有的请求都做身份验证。hasRole表示针对当前的请求访问某个地址,或者所有的请求访问时是否具备某个角色。当然这个角色或者权限的验证,需要定制扩展接口就可以了。比如连数据库或者连缓存,实现角色查询,有校验就可以了。
@ Configuration
@ (SecurityProperties.BASIC_AUTH_ORDER - 10)
public class ApplicationConfigurerAdapter extends
WebSecurityConfiguerAdapter{
@Override
protected void configure( http) throws
{
http.antMatcher("/admin/**")
.authorizeRequests()
.antMatchers("/admin/users").hasRole(“usersAdmin")
.antMatchers("/admin/orders").hasRole(“ordersAdmin")
.anyRequest().isAuthenticated();
}
}
(四)重新实现验证机制
当然有一般规则,就有特殊规则,允许自定义扩展底层的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规则,判断请求是不是要拦截,验证,然后放行或者拒绝。验证过程,可以调用缓存或数据库实现安全验证规则。
其他的Java面试题这节课就不一一说明了,留给大家课后思考。
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,跳槽一线互联网公司。