1. 背景
1.1 三个概念
1.1.1 cookie
Cookie是Web应用中常用的一种认证机制,通过在客户端存储一些信息,如用户名、密码等,实现用户身份的认证。
1.1.2 session
Session是一个存储用户会话状态的对象。当用户首次访问一个网站时,服务器会创建一个Session对象,用于存储用户的会话信息,如用户名、密码等。当用户重新访问该网站时,服务器会与该Session对象进行比较,如果一致,则允许该用户继续访问网站,否则将拒绝该用户的访问。
1.1.3 token
Token是一种身份验证机制,通过在客户端存储一些信息,如令牌号、时间戳等,实现用户身份的认证。在Spring Security中,Token也是一种认证方式,通过在客户端存储用户的令牌信息,实现用户身份的认证。
1.2 需解决的问题
认证(Authentication):验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。
授权(Authorization):经过认证后判断当前用户是否有权限进行某个操作。
认证和授权就是SpringSecurity作为安全框架的核心功能。
2. 简介
Spring Security是一个基于Spring框架的安全管理模块,它提供了身份认证、授权、加密、会话管理等功能,可以保护Web应用程序免受恶意攻击和非法访问。Spring Security可以与Spring Boot无缝集成,提供了自动化配置和灵活的扩展机制。
Shiro是一个开源的安全框架,它简洁地处理身份认证、授权、企业会话管理和加密等问题。Shiro的设计目标是易于使用和理解,它可以在任何应用程序环境下工作,不依赖于其他第三方框架或容器。Shiro提供了一套直观和易用的API,来简化开发人员在实现应用程序安全上的努力。
本文将对比Spring Security和Shiro两个框架的特点和使用方法,并给出一个基于Spring Boot的示例项目,展示如何使用这两个框架来实现登录与认证功能。
3. 框架
3.1 shiro框架介绍
Shiro框架的核心概念有三个:Subject,SecurityManager和Realms。
- Subject:代表当前与应用程序交互的实体(用户,第三方服务,cron job等),它提供了身份认证、授权、会话管理等接口。开发人员只需要与Subject交互,就可以完成安全相关的操作。
- SecurityManager:是Shiro框架的心脏,它是一个“保护伞”对象,协调内部的安全组件共同工作。它也管理每个应用程序用户的Shiro视图,知道如何执行每个用户的安全操作。当与Subject交互时,实际上是SecurityManager处理所有繁重的安全操作。
- Realms:是Shiro和应用程序安全数据之间的“桥梁”或“连接器”。当需要执行身份验证或授权时,Shiro会从一个或多个配置的Realm中获取相关的数据。Realm本质上是一个特定安全的DAO,它封装了数据源的连接细节,使Shiro所需的数据可用。
Shiro框架还提供了一些其他功能来支持和增强不同环境下的安全需求,如:
- Web Support:Shiro的Web支持API能够轻松地帮助保护Web应用程序。
- Caching:缓存是Shiro中的一等公民,来确保安全操作快速而高效。
- Concurrency:Shiro利用它的并发特性来支持多线程应用程序。
- Testing:测试支持帮助编写单元测试和集成测试,并确保应用程序安全。
- Run As:允许用户假设另一个用户身份(如果允许)的功能,在管理脚本中很有用。
- Remember Me:在会话中记住用户身份,使他们只需要在强制时登录。
下图展示了Shiro框架的核心组件及其关系:
3.2 spring security的使用
Spring Security框架的核心概念有四个:Authentication,Authorization,FilterChain和WebSecurityConfigurerAdapter。
- Authentication:代表用户的身份信息,包括用户名、密码、角色等。Spring Security提供了多种Authentication实现,如UsernamePasswordAuthenticationToken,JwtAuthenticationToken等。AuthenticationManager是一个接口,负责验证Authentication对象,并返回一个经过认证的Authentication对象或抛出异常。Spring Security提供了多种AuthenticationManager实现,如ProviderManager,DaoAuthenticationProvider等。
- Authorization:代表用户的访问控制信息,包括用户可以访问哪些资源,以及可以执行哪些操作。Spring Security提供了多种Authorization实现,如AccessDecisionManager,AccessDecisionVoter等。AccessDecisionManager是一个接口,负责根据Authentication对象和请求的资源(FilterInvocation)来决定是否允许访问或抛出异常。AccessDecisionVoter是一个接口,负责对某个请求进行投票,返回赞成、反对或弃权的结果。
- FilterChain:是一个过滤器链,负责拦截请求,并调用相应的过滤器进行处理。Spring Security提供了多种Filter实现,如UsernamePasswordAuthenticationFilter,JwtAuthenticationFilter等。Filter是一个接口,负责根据请求的信息和配置的规则来执行相应的逻辑,并返回相应的结果或继续调用下一个Filter。
- WebSecurityConfigurerAdapter:是一个抽象类,负责配置WebSecurity和HttpSecurity对象。WebSecurity是一个类,负责配置FilterChain和相关的过滤器。HttpSecurity是一个类,负责配置请求的匹配规则和授权规则。开发人员可以通过继承WebSecurityConfigurerAdapter类,并重写其中的方法来自定义Web安全配置。
Spring Security框架还提供了一些其他功能来支持和增强不同环境下的安全需求,如:
- Web Support:Spring Security提供了一些Web相关的组件和注解,如 @PreAuthorize,@PostAuthorize等,来简化Web层的安全控制。
- Caching:Spring Security支持使用缓存来存储用户的身份信息和权限信息,来提高性能和减少数据库访问。
- Concurrency:Spring Security支持使用会话管理来控制用户的并发登录数量和过期策略。
Testing:Spring Security提供了一些测试工具类和注解,如@WithMockUser,@WithUserDetails等,来方便编写测试用例。 - OAuth 2.0:Spring Security支持使用OAuth 2.0协议来实现第三方认证和授权功能。
- JWT:Spring Security支持使用JWT(JSON Web Token)来实现无状态的身份认证和授权功能。
下图展示了Spring Security框架的核心组件及其关系: