SpringSecurity总结
本文最后更新于:3 年前
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它保护基于spring的应用程序的标准。
简介
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它保护基于spring的应用程序的标准。
Spring Security的核心是用户认证(Authentication)和用户授权(Authorization)。
用户认证
用户认证指的是验证某个用户是否为系统中的合法主体,通俗点说就是系统认为用户是否能登录。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
在用户认证方面,SpringSecurity 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID
和 LDAP 等。
用户授权
用户授权指的是验证某个用户是否有权限执行某个操作,通俗点讲就是系统判断用户是否有权限去做某些事情。。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。
与Shiro的对比
Spring Security 特点:
- 与 Spring 无缝整合。
- 全面的权限控制。
- 专门为 Web 开发而设计。
- 旧版本不能脱离 Web 环境使用。
- 新版本对整个框架进行了分层抽取,分成了核心模块和 Web 模块。单独引入核心模块就可以脱离 Web 环境。
- 重量级。
Shiro特点:
- 轻量级。Shiro 主张的理念是把复杂的事情变简单。针对对性能有更高要求的互联网应用有更好表现。
- 通用性。
- 好处:不局限于 Web 环境,可以脱离 Web 环境使用。
- 缺陷:在 Web 环境下一些特定的需求需要手动编写代码定制。
一般来说,常见的安全管理技术栈的组合是这样的:
- SSM + Shiro
- Spring Boot/Spring Cloud + Spring Security
权限管理中的相关概念
主体
英文单词:principal
使用系统的用户或设备或从其他系统远程登录的用户等等。简单说就是谁使用系统谁就是主体。
认证
英文单词:authentication
权限管理系统确认一个主体的身份,允许主体进入系统。简单说就是“主体”证明自己是谁。
笼统的认为就是以前所做的登录操作。
授权
英文单词:authorization
将操作系统的“权力”“授予”“主体”,这样主体就具备了操作系统中特定功能的能力。
所以简单来说,授权就是给用户分配权限。
SpringSecurity 基本原理
SpringSecurity 本质是一个过滤器链。
涉及的14条过滤器:
1 |
|
重要的3条过滤器:
- FilterSecurityInterceptor
- ExceptionTranslationFilter
- UsernamePasswordAuthenticationFilter
FilterSecurityInterceptor过滤器
方法级的权限过滤器, 基本位于过滤链的最底部。
ExceptionTranslationFilter过滤器
异常过滤器,用来处理在认证授权过程中抛出的异常
UsernamePasswordAuthenticationFilter过滤器
对/login 的 POST 请求做拦截,校验表单中用户名,密码。
主要类
·WebSecurityConfigurerAdapter: 自定义Security策略
·AuthenticationManagerBuilder:自定义认证策略
·@EnableWebSecurity:开启WebSecurity模式
Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。
“认证”(Authentication)
- 身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。
- 身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。
“授权” (Authorization)
- 授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,
几乎任何内容)的完全权限。 - 这个概念是通用的,而不是只在Spring Security 中存在。
学习和API文档
认证和授权
引入 Spring Security
模块
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!