前军教程网

中小站长与DIV+CSS网页布局开发技术人员的首选CSS学习平台

Spring Security框架实现底层原理

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>

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言