Spring Security
Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。
Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是Spring Security重要核心功能。 (1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录 (2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。通俗点讲就是系统判断用户是否有权限去做某些事情。
Spring Security功能
Spring Security 的核心功能主要包括如下几个:
认证 :认证即系统判断用户的身份是否合法,合法可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录、二维码登录、手机短信登录、脸部识别认证、指纹认证等方式。 认证是为了保护系统的隐私数据与资源,用户的身份合法才能访问该系统的资源。 授权:授权即认证通过后,根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则正常访问,没有权限则拒绝访问。 比如在一些视频网站中,普通用户登录后只有观看免费视频的权限,而VIP用户登录后,网站会给该用户提供观看VIP视频的权限。 认证是为了保证用户身份的合法性,授权则是为了更细粒度的对隐私数据进行划分,控制不同的用户能够访问不同的资源。 防护攻击:防止身份伪造等各种攻击手段。 加密功能:对密码进行加密、匹配等。 会话功能:对Session进行管理。 RememberMe功能:实现“记住我”功能,并可以实现token令牌持久化。
Spring Security支持的身份认证模式
在身份验证层面,Spring Security广泛支持各种身份认证模式。这些验证模式绝大多数都是由第三方提供,或相关标准组织提供的,目前Spring Security支持如下认证技术:
-
HTTP BASIC authentication headers: 一个基于IEFT RFC的标准。
-
HTTP Digest authentication headers: 一个基于IETF RFC的标准。
-
HTTP X.509 client certificate exchange: 一个基于IETF RFC的标准。
-
LDAP: 一种常见的跨平台身份验证方式。
-
Form-based authentication: 用于简单的用户界面需求。
-
OpenID authentication: 一种去中心化的身份认证方式。
-
Authentication based on pre-established request headers: 类似于 Computer Associates SiteMinder,一种用户身份验证及授权的集中式安全基础方案。
-
Jasig Central Authentication Service: 单点登录方案。
-
Transparent authentication context propagation for Remote Method Invocation (RMI) and HttpInvoker: 一个Spring远程调用协议。
-
Automatic "remember-me" authentication: 允许在指定到期时间前自行重新登录系统。
-
Anonymous authentication: 允许匿名用户使用特定的身份安全访问资源。
-
Run-as authentication: 允许在一个会话中变换用户身份的机制。
-
Java Authentication and Authorization Service: JAAS,Java验证和授权API.
-
Java EE container authentication: 允许系统继续使用容器管理这种身份验证方式。
-
Kerberos: 一种使用对称密钥机制,允许客户端与服务器相互确认身份的认证协议。
创建security项目
先创建springboot项目导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
创建controller.HelloController
package com.zking.security.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello security";
}
}
启动项目访问:localhost:8080/hello
流程:先访问localhost:8080/login登录在回滚跳hello,而直接访问login登录后将404,因为我们还没设默认访问页面
默认账号:user
密码到控制台复制:
通过配置文件来设置用户和密码
创建resources.application.yml文件
spring:
security:
user:
name: jack
password: 123456#注:此后不会在控制台输出密码,
权限管理中的相关概念
主体
英文单词:principal /ˈprɪnsəp(ə)l/ 使用系统的用户或设备或从其他系统远程登录的用户等等。简单说就是谁使用系统谁就是主体。
认证
英文单词:authentication /ɔːˌθentɪˈkeɪʃn/ 权限管理系统确认一个主体的身份,允许主体进入系统。简单说就是“主体”证明自己是谁。 笼统的认为就是以前所做的登录操作。
授权
英文单词:authorization /ˌɔːθəraɪˈzeɪʃ(ə)n/ 将操作系统的“权力”“授予”“主体”,这样主体就具备了操作系统中特定功能的能力。
SpringSecurity 基本原理
过滤器链
SpringSecurity 本质是一个过滤器链: 从启动是可以获取到过滤器链:
SpringSecurity 本质是一个过滤器链: