1.背景
在学习过程中我们使用了shiro和spring security,两者作为安全框架也是各有千秋,所有今天就来描述一下spring security比起shiro为什么使用的越来越多,优势是什么以及认证原理
2.区别和优势
-
区别:
-
Shiro:Apache Shiro 是一个功能强大且易于使用的开源安全框架,提供了身份验证、授权、加密、会话管理等功能。Shiro 的设计理念是简单直观,易于集成到各种应用中,适用于各种规模的项目。
-
Spring Security:Spring Security 是 Spring 生态系统中的安全框架,提供了全面的安全解决方案,包括身份验证、授权、会话管理、攻击防护等功能。Spring Security 的设计是基于 Spring 框架的,与 Spring 框架深度集成,适用于基于 Spring 的项目。
-
-
优势:
-
Shiro 优势:
- 简单易用:Shiro 的设计简单直观,易于理解和使用。
- 灵活性:Shiro 提供了丰富的配置选项和可插拔的组件,可以根据需求定制安全策略。
- 轻量级:Shiro 的核心库相对较小,不依赖其他框架,适合轻量级项目。
-
Spring Security 优势:
- 深度集成:Spring Security 与 Spring 框架深度集成,可以方便地与 Spring 其他模块结合使用。
- 社区支持:Spring Security 是 Spring 生态系统中的官方安全框架,得到了广泛的社区支持和持续的更新维护。
- 多样性:Spring Security 提供了丰富的安全功能和扩展点,适用于各种复杂的安全需求。
-
3.应用场景
-
项目类型:
- Shiro:适用于各种规模的项目,特别适合中小型项目或独立的安全认证控制需求。
- Spring Security:适用于基于 Spring 框架的项目,特别适合需要与 Spring 框架深度集成的大型企业级项目。
-
技术栈:
- Shiro:独立于任何框架,可以与各种 Java 技术栈集成,灵活性较高。
- Spring Security:与 Spring 框架深度集成,提供了与 Spring 其他模块的无缝整合,适合已经使用 Spring 的项目。
-
功能需求:
- Shiro:提供了简单直观的身份验证、授权、加密、会话管理等功能,适用于简单的安全控制需求。
- Spring Security:提供了全面的安全解决方案,包括身份验证、授权、会话管理、攻击防护等功能,适用于复杂的安全控制需求。
4.认证流程
1.简介
1.SpringSecurity的本质就是一个过滤器链,内部包含了提供各种功能的过滤器,所有的认证流程都是通过过滤器来完成的,下面就是以下就是具体的认证信息
-
用户提交认证请求:用户在应用程序的登录页面输入用户名和密码,提交认证请求。
-
AuthenticationFilter 进行认证:Spring Security 中的 AuthenticationFilter 拦截认证请求,根据配置的认证方式进行认证处理。
-
AuthenticationManager 进行身份验证:AuthenticationFilter 将认证信息传递给 AuthenticationManager,AuthenticationManager 负责实际的身份验证过程。
-
ProviderManager 委托给 AuthenticationProvider:AuthenticationManager 通常会委托给 ProviderManager,ProviderManager 包含多个 AuthenticationProvider,每个 Provider 负责不同类型的认证。
-
AuthenticationProvider 进行具体认证:AuthenticationProvider 根据配置的认证方式(如用户名密码认证、LDAP 认证等)对用户进行身份验证,验证成功则返回一个经过身份验证的 Authentication 对象。
-
认证成功处理:如果认证成功,AuthenticationManager 将认证成功的 Authentication 对象返回给 AuthenticationFilter,AuthenticationFilter 会根据配置的成功处理器(如登录成功跳转页面)进行后续处理。
-
认证失败处理:如果认证失败,AuthenticationProvider 会抛出相应的异常,AuthenticationManager 会将异常传递给 AuthenticationFilter,AuthenticationFilter 会根据配置的失败处理器(如登录失败提示)进行后续处理。
-
生成认证凭证:认证成功后,Spring Security 会生成一个包含用户信息和权限信息的认证凭证(Authentication)对象,并将其存储在 SecurityContextHolder 中,供后续的权限控制和访问控制使用。
2.认证流程中的核心类
Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息
AuthenticationManager接口:定义了认证Authentication的方法
UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法
UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中
UsernamePasswordAuthenticationFilter实现类:实现了我们最常用的基于用户名和密码的认证逻辑,封装Authentication对象
3.认证全过程
1.通过浏览器提交用户名密码
我们一开始会给我一个默认的登录页面,通过提交 http://localhost:8080/login,在输入默认的用户名称和密码进入
2.通过提交信息后默认的登录是用UsernamepasswordAuthencitionFilter过滤器去拦截
3.调用AuthenticationManager的authenticate方法进行认证
因为AuthenticationManager中管理了一群Provider,所以调用的就是那一群Provider的authenticate方法进行认证