aneasystone's blog - 2023年5月
type: channel
link: https://www.aneasystone.com/2023/05
description: The quieter you become, the more you are able to hear.
items: 读源码剖析 Spring Security 的实现原理
items: 基于 Argo CD 的 GitOps 实践笔记

读源码剖析 Spring Security 的实现原理
type: item
date: 2023-05-28T23:51:00+00:00
description: Spring Security 是一个轻量级的安全框架，可以和 Spring 项目很好地集成，提供了丰富的身份认证和授权相关的功能，而且还能防止一些常见的网络攻击。我在工作中有很多项目都使用了 Spring Security 框架，但基本上都是浅尝辄止，按照说明文档配置好就完事了，一直没有时间深入地研究过。最近在 Reflectoring 上看到了一篇文章 Getting started with Spring Security and Spring Boot，写得非常全面仔细，感觉是一篇不错的 Spring Security 入门文章，于是花了一点时间拜读了一番，结合着 官方文档 和 源码 系统地学习一下 Spring Security 的实现原理。入门示例我们先从一个简单的例子开始，这里我直接使用了 使用 Spring 项目脚手架 中的 Hello World 示例。为了让这个示例程序开启 Spring Security 功能，我们在 pom.xml 文件中引入 spring-boot-starter-security 依赖即可：<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>启动程序，会在控制台日志中看到类似下面这样的信息：2023-05-15 06:52:52.418 INFO 8596 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: eeb386a9-e16a-4b9b-bbc6-c054c8d263b0这个是由 Spring Security 随机生成的密码。访问 /hello 页面，可以看到出现了一个登录页面：输入用户名（默认为 user）和密码（控制台日志）登录成功后我们才能正常访问页面。默认的用户名和密码可以使用下面的配置进行修改：spring.security.user.name=admin spring.security.user.password=123456为了后续更好地对 Spring Security 进行配置，理解 Spring Security 的实现原理，我们需要进一步学习 Spring Security 的三大核心组件：过滤器（Servlet Filters）认证（Authentication）授权（Authorization）Servlet Filters：Spring Security 的基础我们知道，在 Spring MVC 框架中，DispatcherServlet 负责对用户的 Web 请求进行分发和处理，在请求到达 DispatcherServlet 之前，会经过一系列的 Servlet Filters，这被称之为过滤器，主要作用是拦截请求并对请求做一些前置或后置处理。这些过滤器串在一起，形成一个过滤器链（FilterChain）：我们可以在配置文件中加上下面的日志配置：logging.level.org.springframework.boot.web.servlet.ServletContextInitializerBeans=TRACE然后重新启动服务，会在控制台输出类似下面这样的日志（为了方便查看，我做了一点格式化）：2023-05-18 07:08:14.805 TRACE 10020 --- [ main] o.s.b.w.s.ServletContextInitializerBeans : Added existing Filter initializer bean 'webMvcMetricsFilter'; order=-2147483647, resource=class path resource [org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.class] 2023-05-18 07:08:14.806 TRACE 10020 --- [ main] o.s.b.w.s.ServletContextInitializerBeans : Added existing Filter initializer bean 'securityFilterChainRegistration'; order=-100, resource=class path resource [org/sprin…

基于 Argo CD 的 GitOps 实践笔记
type: item
date: 2023-05-07T22:32:00+00:00
description: GitOps 这个概念最早是由 Weaveworks 的 CEO Alexis Richardson 在 2017 年提出的，它是一种全新的基于 Git 仓库来管理 Kubernetes 集群和交付应用程序的方式。它包含以下四个基本原则：声明式（Declarative）：整个系统必须通过声明式的方式进行描述，比如 Kubernetes 就是声明式的，它通过 YAML 来描述系统的期望状态；版本控制和不可变（Versioned and immutable）：所有的声明式描述都存储在 Git 仓库中，通过 Git 我们可以对系统的状态进行版本控制，记录了整个系统的修改历史，可以方便地回滚；自动拉取（Pulled automatically）：我们通过提交代码的形式将系统的期望状态提交到 Git 仓库，系统从 Git 仓库自动拉取并做出变更，这种被称为 Pull 模式，整个过程不需要安装额外的工具，也不需要配置 Kubernetes 的认证授权；而传统的 CI/CD 工具如 Jenkins 或 CircleCI 等使用的是 Push 模式，这种模式一般都会在 CI 流水线运行完成后通过执行命令将应用部署到系统中，这不仅需要安装额外工具（比如 kubectl），还需要配置 Kubernetes 的授权，而且这种方式无法感知部署状态，所以也就无法保证集群状态的一致性了；持续调谐（Continuously reconciled）：通过在目标系统中安装一个 Agent，一般使用 Kubernetes Operator 来实现，它会定期检测实际状态与期望状态是否一致，一旦检测到不一致，Agent 就会自动进行修复，确保系统达到期望状态，这个过程就是调谐（Reconciliation）；这样做的好处是将 Git 仓库作为单一事实来源，即使集群由于误操作被修改，Agent 也会通过持续调谐自动恢复。其实，在提出 GitOps 概念之前，已经有另一个概念 IaC （Infrastructure as Code，基础设施即代码）被提出了，IaC 表示使用代码来定义基础设施，方便编辑和分发系统配置，它作为 DevOps 的最佳实践之一得到了社区的广泛关注。关于 IaC 和 GitOps 的区别，可以参考 The GitOps FAQ。Argo CD 快速入门基于 GitOps 理念，很快诞生出了一批 声明式的持续交付（Declarative Continuous Deployment） 工具，比如 Weaveworks 的 Flux CD 和 Intuit 的 Argo CD，虽然 Weaveworks 是 GitOps 概念的提出者，但是从社区的反应来看，似乎 Argo CD 要更胜一筹。Argo 项目最初是由 Applatix 公司于 2017 年创建，2018 年这家公司被 Intuit 收购，Argo 项目就由 Intuit 继续维护和演进。Argo 目前包含了四个子项目：Argo Workflows、Argo Events、Argo CD 和 Argo Rollouts，主要用于运行和管理 Kubernetes 上的应用程序和任务，所有的 Argo 项目都是基于 Kubernetes 控制器和自定义资源实现的，它们组合在一起，提供了创建应用程序和任务的三种模式：服务模式、工作流模式和基于事件的模式。2020 年 4 月 7 日，Argo 项目加入 CNCF 开始孵化，并于 2022 年 12 月正式毕业，成为继 Kubernetes、Prometheus 和 Envoy 之后的又一个 CNCF 毕业项目。这一节我们将学习 Argo CD，学习如何通过 Git 以及声明式描述来部署 Kubernetes 资源。安装 Argo CDArgo CD 提供了两种 安装形式：多租户模式（Multi-Tenant） 和 核心模式（Core）。多租户模式提供了 Argo CD 的完整特性，包括 UI、SSO、多集群管理等，适用于多个团队用户共同使用；而核心模式只包含核心组件，不包含 UI 及多租户功能，适用于集群管理员独自使用。使用比较多的是多租户模式，官方还为其提供了两份部署配置：非高可用配置 install.yaml 和高可用配置 ha/install.yaml，生产环境建议使用高可用配置，开发和测试环境可以使用非高可用配置，下面就使用非高可用配置来安装 Argo CD。首先，创建一个 argocd 命名空间：$ kubectl create namespace argocd namespace/argocd created接着将 Argo CD 部署到该命名空间中：$ kubectl apply -n argocd -f https://raw.gi…