Spring Security 基本介绍,初窥路径

Spring Security 基本介绍和环境搭建

实验介绍

Spring Security 是一个非常强大的身份验证和授权控制框架。为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过简单的调整配置,就能为我们的应用提供一套可靠的安全保障。本节课程主要任务就是搞清楚 Spring Security 是干什么的,以及它的基本用法。

知识点

  • 系统安全和系统保护设计
  • Spring Security 核心功能介绍
  • Spring Security 项目搭建
  • Spring Security 的基本操作

系统安全和系统保护设计

在实际开发过程中,为了保证我们的系统能够安全稳定的运行下去,一般都要从下面两点来考虑:

  1. 系统安全性:防止非法入侵、非法请求、非法拦截等。我们需要阻止和屏蔽不信任的请求源访问,保证数据的安全可靠,不被人窃取。
  2. 系统健壮性:也就是系统可用性,最常见的解决方案就是做服务 “冗余”。当然量级够大的话,要做的事情会很多很多,比如限流、熔断、降级等等。

这里只简单的谈一谈系统的安全性,在项目的开发中需要从全方位、多角度做工作,以确保整个业务链路、整个体系范围都能保证安全。下面就大致介绍下在实际开发过程中,开发者经常用到的一些方法:

  • 数据校验,包括前端 js 校验和后端校验,其实前端校验主要是为了体验,也就是尽可能降低出错率,提高一次性提交的成功率。也可以说前端校验规则是后端校验的子集。

  • 防止命令注入,比如最常见的 SQL 注入,它不是利用操作系统的 BUG 来实现攻击,而是针对程序员编程时的疏忽,通过 SQL 语句,实现无帐号登录,甚至篡改数据库。

  • 认证安全,对于使用应用的实体,无论是人还是系统程序,都应当做到对每个请求都能找到对应的责任实体。因此,在处理请求前,要先对认证信息进行检测。

  • 登录鉴权,即要控制这个用户登录后能在系统中做什么,比如一般要把用户分为外部用户、员工等。

  • 数据加密,对于敏感数据,不得明文传输和明文存储。如数据存储中,密码等信息我们可以加密后再存储;数据传输中,对密文使用 DES3/RSA 加密。

  • 请求签名,在外部请求时也是常见的处理方式,只有通过接口签名验证的请求,才信任为合法的请求。

在系统的安全方面,我们的 Spring Security 框架,解决的最主要的问题就是 认证安全 和 登录鉴权。

Spring Security 核心功能介绍

Spring Security 其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在 Spring Security 中一种过滤器处理一种认证方式。比如,对于 username password 认证过滤器来说:

  • 会检查是否是一个登录请求;
  • 是否包含 username 和 password (也就是该过滤器需要的一些认证信息);
  • 如果不满足则放行给下一个。

然后下一个认证过滤器,再次按照自身职责判定是否是自身需要的信息。中间可能还有更多的认证过滤器,只要有一个认证过滤器通过了,就是用户登录成功。

在整个过滤器中的最后一环是 FilterSecurityInterceptor,这里会判定该请求是否能进行访问 REST 服务,如果被拒绝了就会抛出不同的异常(根据具体的原因)。

Exception Translation Filter 会捕获抛出的错误,然后根据不同的认证方式进行信息的返回提示。

项目搭建

概念一下说多了也未必好理解,还是先上手,后面再慢慢熟悉比较好。打开实验楼环境,依次点击 Terminal --> New Terminal(打开命令行),可以看到下方出现命令行工具,创建我们的第一个项目(hello_security),直接输入下面的命令:

mvn archetype:generate -DgroupId=com.shiyanlou -DartifactId=hello_security -DarchetypeArtifactId=maven-archetype-webapp

输入完,然后直接回车即可自动创建项目。我们创建一个基于 Spring Boot 的 Web 项目,maven 全部依赖如下:
hello_security/pom.xml

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.8.RELEASE</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

这个项目就是个简单的 Spring Boot 项目,先把需要的目录创建好,按照下面的目录结构创建出来:

也就是在 src/main/ 下创建 java 目录,再在其下面创建 com/shiyanlou 包目录,同时在该目录下创建我们的 Spring Boot 启动类:
hello_security/src/main/java/com/shiyanlou/Application.java

package com.shiyanlou;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

再在 src/main/resources/ 下创建 templates 目录,然后在 src/main/resources/templates 目录下创建两个页面:
home.html

<!DOCTYPE html>
<html
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:th="http://www.thymeleaf.org"
  xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"
>
  <head>
    <title>home.html</title>
  </head>
  <body>
    <h1>Welcome!</h1>
    <p>
      Click
      <a th:href="@{/hello}">here</a>
      to see a greeting.
    </p>
  </body>
</html>

hello.html

<!DOCTYPE html>
<html
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:th="http://www.thymeleaf.org"
  xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"
>
  <head>
    <title>hello.html</title>
  </head>
  <body>
    <h1>Hello world!</h1>
  </body>
</html>

页面很简单,要做的事也很简单:点击 home 视图中的 “/hello” 链接跳转到 hello 页面。首先配置视图控制器来暴露这些页面, 如下是一个典型的 Spring MVC 配置类:

hello_security/src/main/java/com/shiyanlou/MvcConfig.java

package com.shiyanlou;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfig implements WebMvcConfigurer {

  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/home").setViewName("home");
    registry.addViewController("/").setViewName("home");
    registry.addViewController("/hello").setViewName("hello");
    registry.addViewController("/login").setViewName("login");
  }

第四个视图控制器引用另一个名为 login 的视图,后面会用上,先不管。现在可以启动项目了,这里注意,在实验楼 WebIDE 中运行项目需要命令行启动,必须在 pom.xml 中添加 maven 插件:

hello_security/pom.xml

<?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>

  <groupId>com.shiyanlou</groupId>
  <artifactId>hello_security</artifactId>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>
      <!--spring boot 打包插件-->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>com.shiyanlou.Application</mainClass>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

同时命令行中切换到自己的项目目录下(和 pom.xml 同级),再执行 mvn spring-boot:run 命令:

等项目启动完成后,点击右侧菜单的 Web 服务 按钮,将会自动打开浏览器,看到下面的运行效果:

本文内容来自蓝桥云课《玩转 Spring Security 从入门到实战》 ,点击可查看全部内容。

原文地址:https://www.cnblogs.com/shiyanlou/p/14346483.html