1.2 快速入门

1.2.1 创建项目

第一步:使用Spring Initalizr 创建项目。
1.2 快速入门 - 图1
第二步:选择Java Version为 8。
image.png
第三步:先引入 WEB 开发需要的依赖:
image.png
第四步:选择项目名称和存放位置。
image.png
项目结构:
image.png
完整依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.4.2</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.imcode</groupId>
  12. <artifactId>springsecurity-basic</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>springsecurity-basic</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. <scope>runtime</scope>
  32. <optional>true</optional>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-test</artifactId>
  42. <scope>test</scope>
  43. </dependency>
  44. </dependencies>
  45. <build>
  46. <plugins>
  47. <plugin>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-maven-plugin</artifactId>
  50. <configuration>
  51. <excludes>
  52. <exclude>
  53. <groupId>org.projectlombok</groupId>
  54. <artifactId>lombok</artifactId>
  55. </exclude>
  56. </excludes>
  57. </configuration>
  58. </plugin>
  59. </plugins>
  60. </build>
  61. </project>

1.2.2 Template

image.png

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
    <meta charset="UTF-8">
    <title>系统初始化页面</title>
</head>
<body>
<div>
    Hello Spring Security
    <hr>
    <a th:href="@{/logout}">注销</a>
</div>
</body>
</html>

启动工程访问:http://localhost:8080 显示如下内容:
image.png

访问工程根目录,会进入 springboot 默认的初始化页面 首先去 static 目录寻找index.html, 存在将index.html内容返回给客户端 , 不存在,在去默认模板目录 templates 下寻找index.html 模板,存在返回模板渲染后的内容给客户端。

1.2.3 引入 Spring Security

在pom.xml 中导入相关依赖,同时导入 thymeleaf 对 Spring Security 扩展的安全标签库。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

1.2.4 启动工程

image.png
从启动日志看,spring security 为我们生成了一个随机密码。
访问 http://localhost:8080,这次无法再访问到 index.html 模板,而是跳转到了 http://localhost:8080/login 登录页面。

登录系统

Spring Security 默认策略是所有系统资源都需要登录以后才能访问。

image.png

username 默认为 user password 是启动日志生成的随机密码。

输入用户名和密码登录成功以后,跳转到了系统初始化页面。
image.png
我们在没有编写任何代码的情况下,已经使用 spring security 完成了一个简单的表单认证。

退出系统

点击注销链接 http://localhost:8080/logout, 跳转到提示是否退出页面
image.png
点击Log Out 退出登录,返回到登录页面:
image.png
此时再次访问 http://localhost:8080, 被踢回到了登录页面,说明用户会话已经失效。

1.2.5 基本原理

从启动日志看,SpringSecurity 本质是一个过滤器链:
Will secure any request with [
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2b1952c1,
org.springframework.security.web.context.SecurityContextPersistenceFilter@2ff59d1f,
org.springframework.security.web.header.HeaderWriterFilter@18cabc26,
org.springframework.security.web.csrf.CsrfFilter@26afad85,
org.springframework.security.web.authentication.logout.LogoutFilter@5000c65d,
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@2d06058a,
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@13c0221e,
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@4aacf2ee,
org.springframework.security.web.authentication.www.BasicAuthenticationFilter@23322084,
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@78990910,
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1769f785,
org.springframework.security.web.authentication.AnonymousAuthenticationFilter@78a8dd3f,
org.springframework.security.web.session.SessionManagementFilter@f1d2aaa,
org.springframework.security.web.access.ExceptionTranslationFilter@2b1ea3ef,
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@69690f46]
image.png
如上图所示,Spring Security包含了众多的过滤器,这些过滤器形成了一条过滤器链,所有请求都必须通过这些过滤器后才能成功访问到资源。

  • UsernamePasswordAuthenticationFilter: 用于处理基于表单方式的登录认证;
  • FilterSecurityInterceptor: 用于判断当前请求身份认证是否成功,是否有相应的权限,当身份认证失败或者权限不足的时候便会抛出相应的异常;
  • ExceptionTranslateFilter:异常过滤器,用来处理在认证授权过程中抛出的异常。