Spring Security底层实现就是Servlet执行链上的Filter实现的
它通过一系列的过滤链,层层Filter走下来,最终走到Servlet
正常情况下,这些Filter都需要被注册在我们的Servlet才能够生效
但是为了更灵活的使用,这些Filter将被我们以Bean的形式管理
DelegatingFilterProxy
这个代理的目的是为了将我们放入容器中的Filter加载到Servlet当中使用
顺序是,首先所有需要拦截过滤的Filter将会以Bean的形式加载到容器中
然后经过Proxy(它本身也是一个Filter,会被注册进容器中)通过这个Proxy,容器中其他的Filter就得以被调用,从而实现将所有Filter链式执行的目的,这个行为我们称之为委托
执行顺序是DeleProxy通过FilterProxy调用SecurityFilterChain来实现对Filter0到FilterN的调用
为什么DeleProxy没有直接管理SecurityChain呢?因为这个Chain可能同时存在多个,他们统一又FilterProxy管理
具体是哪个SecurityChain链来处理取决于我们配置的URL匹配规则
package com.alatus.secrurity.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
//开启Spring Security的自定义配置
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
// 创建基于内存的用户信息管理器
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
// 创建UserDetails对象,并设置用户名、密码、角色权限等内容
manager.createUser(User.withDefaultPasswordEncoder().username("admin").password("admin").roles("USER").build());
// 这里我们的manager对象用于管理我们创建的用户信息
return manager;
}
}
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
要使用动态链接,不然会找不到
<a th:href="@{/logout}">Logout</a></a>
<a href="/logout">退出</a>
</body>
</html>