SpringBoot整合SpringSecurity系列(1)-安全框架集成

747 阅读3分钟

一、文章前言

  1. SpringBoot-Security系列篇主要讲解了SpringBoot整合SpringSecurity
  2. 主要包含权限控制、URL匹配、Thymeleaf整合,包含日常项目中使用的大多数场景
  3. 文章内容所有代码都可以正常执行,特殊说明本系列中使用到的PrintUtil和JsonUtil是自己封装的两个小工具,可以使用System.out.println和fastjson实现,功能一致
  4. 文档内容也参考了一些文档,有问题可以评论区留言,相互探讨,相互学习
  5. 本系列完整源码已经放网盘(有需要的可以自行下载上传到git仓库)

链接: pan.baidu.com/s/14JfxHNz7… 提取码: 87vq

  1. 源码说明,其中含有一个common-api依赖,里面是一个简单工具类封装,springboot-security为核心源码在这里插入图片描述

二、Security框架集成

  1. 新建SpringBoot项目,添加spring-boot-starter-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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/>
    </parent>
    <groupId>com.codecoord</groupId>
    <artifactId>springboot-security</artifactId>
    <version>1.0</version>
    <name>springboot-security</name>

    <properties>
        <java.version>1.8</java.version>
    </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-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- security安全框架核心依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>
</project>

  1. 在resources下新建static文件夹,用于存放静态资源文件,并在其中创建两个静态HTML文件,用户登录跳转

login.html:登录页面

<!DOCTYPE html>
<html lang="zh">
<head>
     <meta charset="UTF-8">
     <title>系统登录</title>
</head>
<body>
  <form action="/login" method="post">
      用户名:<input type="text" name="username" /><br/>
      密码:<input type="password" name="password" /><br/>
      <input type="submit" value="登录"/>
  </form>
</body>
</html>

main.html:登录成功后跳转页面

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <title>SpringBoot Security</title>
</head>
<body>
  <h3>欢迎登录SpringBoot Security首页</h3>
</body>
</html>
  1. 新建登录controller,处理登录请求
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {
    @RequestMapping("/login")
    public String login() {
        return "redirect:main.html";
    }
}
  1. 启动项目,访问login.html,发现此页面被拦截,被security的自带登录页面给替代

  2. 输入账号和密码,进行登录

    • 账号:默认user
      • org.springframework.boot.autoconfigure.security.SecurityProperties.User#name
    • 密码在服务启动时在控制台有输出 在这里插入图片描述
  3. 登录之后可跳转login.html 在这里插入图片描述

三、Security密码配置

  1. 上述登录默认登录密码,且每次密码都需要从控制台查找当重启服务时默认密码将会更改
  2. 可以在配置文件中配置固定的账号和密码
    • 只配置用户,密码使用控制台输出
    • 只配置密码,用户名使用默认user
    • 两个都配置,以配置为准
    • 配置文件优先级大于默认
spring:
  # 安全配置
  security:
    user:
      # 配置用户名和密码
      #name: tianxin
      #password: tianxin
      # 配置角色
      roles: admin,normal
  1. 上面配置文件中配置文件方式并不安全,存在密码泄露且无法排查风险
  2. 所以可以进行数据库验证配置,每次验证从数据库中进行验证,数据库验证参考后续文章
  3. 通过简单的引入依赖,就可以集成SpringSecurity

四、CSRF跨站请求伪造

  1. CSRF(Cross-site request forgery-跨站请求伪造):跨站请求伪造也被称为one-click attack或sessionriding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法
  2. 跨域:只要网络协议、ip 地址、端口中任何一个不相同就是跨域请求
  3. 客户端与服务进行交互时,由于 http 协议本身是无状态协议,所以引入了cookie进行记录客户端身份,在cookie中会存放session id用来识别客户端身份
  4. 在跨域的情况下,session id 可能被第三方恶意劫持,通过这个 session id 向服务端发起请求时,服务端会认为这个请求合法,可能发生很多意想不到的事情
  5. 从 Spring Security4开始CSRF防护默认开启,默认会拦截请求进行CSRF处理
  6. CSRF为了保证不是其他第三方网站访问,要求访问时携带参数名为_csrf值为token(token 在服务端产生)的内容,如果token和服务端的token匹配成功,则正常访问
  7. 如果登录控制里面没有关闭csrf保护,则登录请求会跳转到登录页面(如果有对应异常处理器则会跳转到异常处理器)处理
  8. CSRF可以整合thymeleaf进行实现,可以参考thymeleaf整合一节中csrf相关部分