Spring Security 简介
背景分析
企业中数据是最重要的资源,对于这些数据而言,有些可以直接匿名访问,有些只能登录以后才能访问,还有一些你登录成功以后,权限不够也不能访问.总之这些规则都是保护系统资源不被破坏的一种手段.几乎每个系统中都需要这样的措施对数据(资源)进行保护.我们通常会通过软件技术对这样业务进行具体的设计和实现.早期没有统一的标准,每个系统都有自己独立的设计实现,但是对于这个业务又是一个共性,后续市场上就基于共享做了具体的落地实现,例如Spring Security,Apache shiro诞生了.
Spring Security 概述
Spring Security 是一个企业级安全框架,由spring官方推出,它对软件系统中的认证,授权,加密等功能进行封装,并在springboot技术推出以后,配置方面做了很大的简化.市场上现在的分布式架构下的安全控制正在逐步的转向Spring Security.
Spring Security 基本架构
Spring Security 在企业中实现认证和授权业务时,底层构建了大量的过滤器.
其中:
绿色部分为认证过滤器,需要我们自己配置,也可以配置过个认证过滤器.也可以使用Spring Security提供的默认认证过滤器.黄色部分为授权过滤器.Spring Security就是通过这些过滤器然后调用相关对象一起完成认证和授权操作.
Spring Security 快速入门
创建工程
添加项目依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.2.RELEASE</version>
</parent>
<groupId>com.cy</groupId>
<artifactId>02-jt-spring-security</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
创建配置文件
在resources目录下创建application.yml文件,并指定服务端口
server:
port: 8080
创建项目启动类
package com.cy.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringSecurityApplication {
public static void main(String[] args) {
SpringApplication.run(
SpringSecurityApplication.class,
args);
}
}
运行启动类访问测试
第一步:检查控制输出,是否自动生成了一个密码,例如:
Using generated security password: 360123aa-df93-4cd9-bab4-5212af421d2c
第二步:打开浏览器输入http://localhost:8080,然后呈现登录页面,例如:
在登录窗口中输入用户名user(系统默认),密码(服务启动时,控制台默认输出的
密码),然后点击Sign in进行登录,登录成功默认会出现,如下界面:
定义登录成功页面
在项目的resources目录下创建static目录,并在此目录创建一个index.html文件,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Login Ok</h1>
</body>
</html>
启动服务,再次进行登录访问测试,登录成功以后系统默认会跳转到index.html页面,例如
配置登录密码
第一步:编写一个方法(可以在启动类中调用执行),对一个名文进行加密,例如:
static void encodePwd(){
BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
String password="123456";//明文
String newPwd=encoder.encode("123456");
System.out.println(newPwd);//$2a$10$fahHJIe3SJm3KcyiPPQ2d.a2qR029gB3qKHrKanQ87u.KbtZ6Phr.
}
第二步:将用户和密码在在springboot工程的application.yml文件中进行配置,例如:
spring:
security:
user:
name: jack
#password: 123456 #这种写法,密码太简单了
password: '{bcrypt}$2a$10$fahHJIe3SJm3KcyiPPQ2d.a2qR029gB3qKHrKanQ87u.KbtZ6Phr.'
其中,{bcrypt}指定了密码加密时使用的算法
第三步:启动服务,重新进行登录测试.