spring-security整合微服务实践
起因:随着越来越多的业务转移到互联网上,安全性已经成为任何一个应用程序开发的重要考虑因素。而在 Java 应用程序开发中,Spring Security 是一个非常流行的安全框架,可以提供可靠的身份验证、授权和会话管理等安全特性。无论是开发 Web 应用程序、RESTful 服务、单页应用程序或者其他类型的应用程序,都可以使用 Spring Security 来保护应用程序的安全性。同时,Spring Security 还具有非常好的可扩展性,可以与 Spring 生态系统中的其他框架和库进行无缝集成,使开发人员能够构建出复杂的、高度可定制的安全解决方案。因此,使用 Spring Security 是保障应用程序安全的不二选择。
技术选型
Spring Security | Apache Shiro | Apache Knox | Keycloak | Stormpath | |
---|---|---|---|---|---|
概述 | Spring Security 是一个非常流行的 Java 应用程序安全框架,提供了完整的身份验证、授权和会话管理功能。它具有良好的可扩展性和灵活性,能够与 Spring 生态系统中的其他框架和库无缝集成 | Apache Shiro 是一个轻量级的安全框架,提供了身份验证、授权、加密和会话管理等功能。它易于使用和集成,能够与任何应用程序框架一起使用,支持多种数据源,如 LDAP、JDBC 和 Active Directory | Apache Knox 是一个开源网关,提供了 REST API 的认证、授权和审计功能。它可以保护 Hadoop 集群的 REST API,提供了单点登录和 OAuth2 支持 | Keycloak 是一个开源的身份认证和访问管理解决方案,基于 OpenID Connect 和 OAuth2 协议。它提供了可扩展的身份验证和授权功能,包括单点登录、多因素身份验证和基于角色的访问控制等 | Stormpath 是一个云身份认证和访问管理服务,提供了完整的身份验证、授权和用户管理功能。它可以与任何应用程序框架一起使用,包括 Java、Node.js 和 .NET |
优点 | 完整的安全特性、与 Spring 框架无缝集成、丰富的插件和扩展、良好的文档和社区支持 | 括轻量级、易于使用和集成、支持多种数据源、优秀的文档 | 保护 Hadoop 集群的 REST API、支持单点登录和 OAuth2、易于配置和使用 | 可扩展的身份验证和授权功能、多种身份验证方式、基于角色的访问控制、易于使用和部署 | 云身份认证和访问管理服务、易于使用和集成、提供完整的身份验证、授权和用户管理功能 |
缺点 | 配置复杂、上手较难 | 与 Spring 框架的深度集成、不够完整的安全特性 | 仅适用于保护 Hadoop 集群的 REST API | 配置复杂、性能较差 | 需要使用云服务、需要支付服务费用,成本高 |
适用场景 | 适用于基于 Spring 框架构建的应用程序 | 适用于不依赖于 Spring 框架的应用程序 | 适用于需要保护 Hadoop 集群的 REST API 的场景 | 适用于需要单独部署一个身份认证和访问管理系统的场景 | 适用于需要使用云身份认证和访问管理服务的场景。 |
小结:
国内目前非常流行的就是Spring Security和Apache Shiro 。
Spring Security出现的时间较早,在springboot没火起来之前一直都是Shiro 的天下,但目前最能和spring全家桶整合起来的就是Spring Security,Spring Security 是最为完整、可扩展和灵活的安全框架,而且与 Spring 框架的深度集成使得使用和配置变得简单方便。Spring Security 提供了全面的身份验证、授权和会话管理特性,并且可以轻松地扩展到支持自定义的安全策略和特性。而且社区也是十分活跃的。所以此篇文章主要从实践流程出发,实现与spring项目整合的快速搭建解决方案。
相对于 Shiro,在 SSM 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了自动化配置方案,可以使用更少的配置来使用 Spring Security。
因此,一般来说,常见的安全管理技术栈的组合是这样的: • SSM + Shiro • Spring Boot/Spring Cloud + Spring Security
如果还想了解shiro这一框架,我也在github开源了一个小demo,用于整合SpringBoot与shiro,实现快速上手,仓库地址:https://github.com/Jachen99/rbac_shiro
介绍
Spring Security简介
Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供 了一套 Web 应用安全性的完整解决方案。
正如你可能知道的关于安全方面的两个核心功能是“认证”和“授权”,一般来说,Web 应用的安全性包括**用户认证(Authentication)和用户授权(Authorization)**两个部分,这两点也是 SpringSecurity 重要核心功能。
(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证过程。
通俗点说就是系统认为用户是否能登录
(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
通俗点讲就是系统判断用户是否有权限去做某些事情。
历史
“Spring Security 开始于 2003 年年底,““spring 的 acegi 安全系统”。 起因是 Spring开发者邮件列表中的一个问题,有人提问是否考虑提供一个基于 spring 的安全实现。
Spring Security 以“The Acegi Secutity System for Spring” 的名字始于 2013 年晚些时候。一个问题提交到 Spring 开发者的邮件列表,询问是否已经有考虑一个基于Spring 的安全性社区实现。那时候 Spring 的社区相对较小(相对现在)。实际上 Spring 自己在2013 年只是一个存在于 ScourseForge 的项目,这个问题的回答是一个值得研究的领域,虽然目前时间的缺乏组织了我们对它的探索。
考虑到这一点,一个简单的安全实现建成但是并没有发布。几周后,Spring 社区的其他成员询问了安全性,这次这个代码被发送给他们。其他几个请求也跟随而来。到 2014 年一月大约有 20 万人使用了这个代码。这些创业者的人提出一个 SourceForge 项目加入是为了,这是在 2004 三月正式成立。
在早些时候,这个项目没有任何自己的验证模块,身份验证过程依赖于容器管理的安全性和 Acegi 安全性。而不是专注于授权。开始的时候这很适合,但是越来越多的用户请求额外的容器支持。容器特定的认证领域接口的基本限制变得清晰。还有一个相关的问题增加新的容器的路径,这是最终用户的困惑和错误配置的常见问题。
Acegi 安全特定的认证服务介绍。大约一年后,Acegi 安全正式成为了 Spring 框架的子项目。1.0.0 最终版本是出版于 2006 -在超过两年半的大量生产的软件项目和数以百计的改进和积极利用社区的贡献。
Acegi 安全 2007 年底正式成为了 Spring 组合项目,更名为"Spring Security"。
流程介绍
要对Web资源进行保护,最好的办法莫过于Filter 要想对方法调用进行保护,最好的办法莫过于AOP。
Spring Security进行认证和鉴权的时候,就是利用的一系列的Filter来进行拦截的。
如图所示,一个请求想要访问到API就会从左到右经过蓝线框里的过滤器,其中绿色部分是负责认证的过滤器,蓝色部分是负责异常处理,橙色部分则是负责授权。经过一系列拦截最终访问到我们的API。
这里面我们只需要重点关注两个过滤器即可:UsernamePasswordAuthenticationFilter
负责登录认证,FilterSecurityInterceptor
负责权限授权。
说明:Spring Security的核心逻辑全在这一套过滤器中,过滤器里会调用各种组件完成功能,掌握了这些过滤器和组件你就掌握了Spring Security!这个框架的使用方式就是对这些过滤器和组件进行扩展。
快速实践
搭建权限框架基本骨架
1、给spring-security创建单独的公共模块
2、导入相关jar包,如果是maven工程,直接引入
<!-- Spring Security依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
说明:依赖包(spring-boot-starter-security)导入后,Spring Security就默认提供了许多功能将整个应用给保护了起来:
- 要求经过身份验证的用户才能与应用程序进行交互
- 创建好了默认登录表单