Spring Security 核心解读(一)整体架构

这篇具有很好参考价值的文章主要介绍了Spring Security 核心解读(一)整体架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提

开源项目一手文档基本都在github,标准文档基本都在官网。
最好的文档就是官网;
在前些年,Apache下还有个比较流行的权限框架 Shiro,但是随着Spring Security (以下简称 Security)的流行,逐渐边缘化。其实这类框架整体设计都大差不差,都是基于一系列的过滤器或者其他拦截手段实现增强。

整体架构

Servlet 整体的过滤器模型

Spring Security 核心解读(一)整体架构
这一块属于 Servlet 基础,过滤器算是Servlet核心功能之一,需重点掌握。

Security 过滤器链

Security 在 Servlet 过滤器上定义了一个 自己的过滤器(这个过滤器使用了委托者设计模式)
Spring Security 核心解读(一)整体架构
可以看到,Servlet 过滤器链上,不仅有 Security 的过滤器还有 Spring Boot 的一些过滤器,但是这里我们重点关注圈起来的那个过滤器(链)
再对比官方的这个图
Spring Security 核心解读(一)整体架构
就更好理解了。

自定义过滤器

我们自定义的过滤器基本都是在 Security 这个过滤器链上面的,通过编排不同的顺序,实现想要的功能。
在这之前,我们先看看Security默认的过滤器链上有哪些过滤器官方列表
这里为了照顾,访问不了官网的,简单截个图。
Spring Security 核心解读(一)整体架构
Spring Security 核心解读(一)整体架构
但不是所有过滤器默认都开启了的。
Spring Security 核心解读(一)整体架构
上面那个链是,Spring 全局的过滤器链,里面第四个过滤器委托给了下面那个 Security 的过滤器链,在 Security 的过滤器链中,可以看到默认有14个过滤器。
其中有几个重点关注的是:

  • SecurityContextPersistenceFilter (即将过时,替代者为 SecurityContextHolderFilter),其功能为,支持默认的基于 Cookie 的登录形式;对于新接触认证授权的开发者,要明白一点,不管什么实现方案,每一次进行鉴权,其本质会进行一次登录认证,只是方式不同而已
  • LogoutFilter 注销登录的过滤器,默认的url为 /logout,要实现自定义退出可以参考
  • UsernamePasswordAuthenticationFilter 大部分开发者,开始接触 Security 都是模仿这个 过滤器实现的自定义登录
  • AnonymousAuthenticationFilter 在 Security 中,认证没有通过或者没有匹配上认证过滤器的请求,最终会被定义为匿名认证,这也是一种认证结果,在权限中也有相关的配置。

其他的过滤器根据自己的需求,调整。

实际开发解决方案

在实际开发中,目前通常采用前后端分离的形式;有的前端对Cookie 不太友好;因此,为了统一,大部分开发者会采用 header 认证方式。
这样实现起码会有两个点需要调整

  1. 调整默认认证成功的处理方式
    默认配置下,认证成功会跳转到一个指定的页面;现在大多会把这个跳转交给前端。
  2. 改为header 传递认证参数后,默认的过滤器就不支持了,需要定义一个 过滤器,解析header,并进行认证;个人推荐将这个认证过滤器放在
    AnonymousAuthenticationFilter 的前面,因为前面还有些其他认证过滤器,如果自定义的过滤器太靠前,可能会被其他认证过滤器(比如上面提到的 SecurityContextPersistenceFilter 以及 SecurityContextHolderFilter)给覆盖掉认证信息,当然这要取决实际的优先级,万一你就想自定义的认证认证过滤器优先级低一点呢
    Spring Security 核心解读(一)整体架构
    可以看到,这两个认证过滤器不管你是否已经认证,会直接覆盖掉认证信息。

一个替代cookie认证的filter

提供一个简单实现,具体业务逻辑,开发者自己填充文章来源地址https://www.toymoban.com/news/detail-467605.html

package authorization.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;

public class JwtAuthenticationFilter extends OncePerRequestFilter {
	private final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class);

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		String token = request.getHeader("token");
		if (!StringUtils.hasText(token)) {
			filterChain.doFilter(request, response);
			return;
		}
		try {
			UsernamePasswordAuthenticationToken authenticationToken
					= UsernamePasswordAuthenticationToken.authenticated("zhangsan", "zs", Collections.emptyList());
			SecurityContext context = SecurityContextHolder.createEmptyContext();
			context.setAuthentication(authenticationToken);
			SecurityContextHolder.setContext(context);
			filterChain.doFilter(request, response);
		}
		finally {
			SecurityContextHolder.clearContext();
		}
	}

	@Override
	protected boolean shouldNotFilterErrorDispatch() {
		return true;
	}
}

其他组件,后续抽时间再整理整理

到了这里,关于Spring Security 核心解读(一)整体架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Security系列】一文带你了解权限框架与Spring Security核心概念

    权限框架是软件开发中用于管理 用户权限和访问控制 的工具。在企业或者我们毕设复杂的系统中,不同的用户或角色需要拥有不同的访问和操作权限,以确保系统的安全性和数据完整性。今天我们就讨论一下Java中的安全框架! 在企业的开发中,Spring Security,Shiro都是比较流

    2024年04月16日
    浏览(39)
  • Spring Boot 与 Spring Security:核心讲解(2)

    过滤器链是Spring Security的核心,它在请求到达应用程序之前对其进行拦截,以便进行身份验证和授权等操作。过滤器链由多个过滤器组成,每个过滤器负责一个特定的安全任务,例如身份验证、授权、会话管理等。过滤器链中的过滤器按照顺序依次执行,直到最后一个过滤器

    2024年02月08日
    浏览(50)
  • Spring Cloud整体架构解析

    Spring Cloud整体架构 本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 Spring Cloud的中文名我们就暂且称呼它为“春云”吧,听上去是多么朴实无华的名

    2024年01月17日
    浏览(35)
  • 系列二、Spring Security中的核心类

    1.2.1、概述         Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供 strength 和 SecureRandom 实例。strength 越大,密钥的迭代次数越多,密钥迭代次数为 2^strength。strength 取值在 4~3

    2024年02月01日
    浏览(37)
  • 【开篇 | Spring深度学习】Spring设计理念和整体架构

    个人名片: 🐼 作者简介:一名大二在校生 🐻‍❄️ 个人主页:落798. 🐼 个人WeChat:落798. 🕊️ 系列专栏: 零基础学java ----- 重识c语言 ---- 计算机网络 — 【Spring技术内幕】 🐓 每日一句: 努力赚钱,娶她回家! Spring 是最流行的企业 Java 应用程序开发框架。 全球数以百

    2024年02月16日
    浏览(49)
  • Spring Security 源码解读:OAuth2 Authorization Server

    样例代码请参考:spring-security-oauth2.0-sample Spring Authorization Server刚发展不久,还没有springboot版本,而Resource Server有,但是两个底层很多不兼容,会重复引入不同版本的jar包。 另外,该 spring-security-oauth2-authorization-server 依赖支持OAuth2.1草案规范。 关于 OAuth2.1 草案介绍请参考

    2023年04月22日
    浏览(43)
  • 【手撕Spring - 深入篇】Spring 的设计理念和整体架构

    👉 博主介绍 : 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ 带你手撕 Spring 🙉八股文专题:剑指大厂,

    2024年02月14日
    浏览(42)
  • Spring Security 的工作原理/总体架构

    目录 1、过滤器的视角 2、DelegatingFilterProxy 委派过滤器代理(类) 2、FilterChainProxy 过滤器链代理(类) 4、SecurityFilterChain 安全过滤器链(接口) 5、Security Filters 安全过滤器实例 6、Spring Security 如何处理安全异常? 7、在认证的时候保存用户请求          // 释义、解读和思

    2024年02月16日
    浏览(42)
  • Spring Security 身份验证的基本类/架构

    目录 1、SecurityContextHolder 核心类 2、SecurityContext 接口 3、Authentication 用户认证信息接口 4、GrantedAuthority 拥有权限接口 5、AuthenticationManager 身份认证管理器接口 6、ProviderManager 身份认证管理器的实现 7、AuthenticationProvider 特定类型的身份验证接口 8、AuthenticationEntryPoint 身份验证

    2024年02月16日
    浏览(39)
  • Spring - Security 之 Servlet身份验证架构

    这个讨论是对之前文章的扩展,用于描述Spring Security在Servlet身份验证中使用的主要架构组件。 组件 描述 SecurityContextHolder SecurityContextHolder是Spring Security存储已认证用户详细信息的位置。 SecurityContext 从SecurityContextHolder获取,包含当前认证用户的认证信息。 Authentication 可以是

    2024年01月23日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包