Spring Security 是一个非常强大的身份验证和授权控制框架。为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过简单的调整配置,就能为我们的应用提供一套可靠的安全保障。本节课程主要任务就是搞清楚 Spring Security 是干什么的,以及它的基本用法。
在实际开发过程中,为了保证我们的系统能够安全稳定的运行下去,一般都要从下面两点来考虑:
这里只简单的谈一谈系统的安全性,在项目的开发中需要从全方位、多角度做工作,以确保整个业务链路、整个体系范围都能保证安全。下面就大致介绍下在实际开发过程中,开发者经常用到的一些方法:
数据校验,包括前端 js 校验和后端校验,其实前端校验主要是为了体验,也就是尽可能降低出错率,提高一次性提交的成功率。也可以说前端校验规则是后端校验的子集。
防止命令注入,比如最常见的 SQL 注入,它不是利用操作系统的 BUG 来实现攻击,而是针对程序员编程时的疏忽,通过 SQL 语句,实现无帐号登录,甚至篡改数据库。
认证安全,对于使用应用的实体,无论是人还是系统程序,都应当做到对每个请求都能找到对应的责任实体。因此,在处理请求前,要先对认证信息进行检测。
登录鉴权,即要控制这个用户登录后能在系统中做什么,比如一般要把用户分为外部用户、员工等。
数据加密,对于敏感数据,不得明文传输和明文存储。如数据存储中,密码等信息我们可以加密后再存储;数据传输中,对密文使用 DES3/RSA 加密。
请求签名,在外部请求时也是常见的处理方式,只有通过接口签名验证的请求,才信任为合法的请求。
在系统的安全方面,我们的 Spring Security 框架,解决的最主要的问题就是 认证安全 和 登录鉴权。
Spring Security 其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在 Spring Security 中一种过滤器处理一种认证方式。比如,对于 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
org.springframework.boot
spring-boot-starter-parent
2.0.8.RELEASE
import
pom
junit
junit
3.8.1
test
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
这个项目就是个简单的 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
home.html
Welcome!
Click
here
to see a greeting.
hello.html
hello.html
Hello world!
页面很简单,要做的事也很简单:点击 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
4.0.0
com.shiyanlou
hello_security
1.0-SNAPSHOT
org.springframework.boot
spring-boot-maven-plugin
com.shiyanlou.Application
repackage
同时命令行中切换到自己的项目目录下(和 pom.xml 同级),再执行 mvn spring-boot:run
命令:
等项目启动完成后,点击右侧菜单的 Web 服务 按钮,将会自动打开浏览器,看到下面的运行效果:
本文内容来自蓝桥云课《玩转 Spring Security 从入门到实战》 ,点击可查看全部内容。