Manning.Spring.Security.in.Action.2020.10.pdf
参考代码: https://github.com/spring-projects/spring-security/tree/master/samples/javaconfig/hellomvc
引入依赖
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- ... 引入 spring-security ... --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>${spring-security.version}</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${spring-security.version}</version></dependency><!-- 内嵌Tomcat --><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>${tomcat.version}</version><scope>provided</scope></dependency><!-- 引入 springmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- 引入logback,用于打印 log --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>${logback.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version></dependency></dependencies>
这里会遇到第一个坑,spring-security 会引入依赖 spring-context ,而在引入 spring-webmvc,也会引入 spring-context,这个时候会发生依赖冲突,所以在引入依赖的时候需要特别小心。需要查看版本。
初始化 spring-security
首先spring 应用的请求是先经过 DispatcherServlet 然后再分发给后面的系统,这里在经过 DispatcherServlet 之后,需要设置一个 filter 来将请求转发给 spring-security 做安全检查。 在官方的实例代码中,首先要新建一个类
package com.example.config;
import org.springframework.core.annotation.Order;
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
@Order(2)
public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
}
就这样,什么都不用做,我们就把请求全部转发给了 spring-security 来进行检查。
spring-security 架构
那么spring-security 是如何工作的呢? 下图进行了说明
一个请求来到了 spring-security ,交给了 Authentication manager 处理
Authentication manager 使用 Authentication provider 进行用户的认证和授权
Authentication provider 会去执行认证登录的逻辑,首先它找到了 UserDetailsService 类查看相关 user 的信息,
然后,通过 Password encoder 校验密码,最后认证通过,返回一个认证过的实体类,存储在安全的上下文中,供随时使用。
