当前位置: 首页 > news >正文

Pac4j 学习笔记

随着互联网技术的飞速发展,网络安全问题日益凸显,企业信息安全与身份认证系统变得越来越重要,而且安全认证集成方案作为保障网络安全的重要一环,其研究与应用也至关重要。在这种背景下,Pac4j 作为一种流行的身份验证库,广泛应用于 Java 应用程序,旨在为企业级应用提供高效、安全的认证服务。Pac4j 全称为 Powerful Authentication Client for Java,它支持多种身份验证协议,如 CAS、OAuth2、LDAP 等,是构建安全认证的集成方案。它提供了简单易用的 API,使得开发者能够轻松地集成身份验证功能到他们的应用程序中。

Pac4j 的一大特点就是为不同供应商提供了很完善的 Client , 基本上无需定制就可以实现认证的处理。它解决了认证过程的复杂性 , 使用者进行简单的调用就可以直接拿到用户信息。

Why choose pac4j?
1 security library = 1 security model for all frameworks
for al authorization mechanisms
for all authentication mechanisms

从编程角度讲,这种方法论是很棒的!简单高效强壮!

与 Spring Security 对比

作者认为 Spring Security 是一个 library,而 pac4j 是一个 framework,虽然都是搞安全的 secuity。详细分析对比参见作者博客:https://www.pac4j.org/blog/spring-boot-security-choose-spring-webmvc-pac4j.html。

客户端 Client

客户端=在 Web 上的一种认证机制。客户端登录成功的话则返回用户信息(User Profile)。Client 有两种案例:

  • 间接的客户端(Indirect clients),这类特征是 UI 程序 有界面的,有状态的(stateful),需要回调的。间接客户端(Indirect clients)在用户认证过程中通常指的是那些不直接与身份服务器进行交互的应用程序。这种情况下,应用程序会通过用户的浏览器重定向到身份服务器来进行认证,然后由身份服务器重定向回应用程序的一个回调端点(callback endpoint)。

  • 直接客户端(Direct clients)在 Web 服务认证中指的是那些直接与身份服务器或资源服务器进行交互的应用程序,通常用于后端服务之间的通信。这类客户端不需要通过用户的浏览器重定向来进行认证,而是直接使用凭据(如 API 密钥、客户端 ID 和秘密等)来获取访问令牌,并且每次 HTTP 请求都携带这个令牌。这种模式通常是无状态的(stateless),即服务器不保存任何会话信息,每个请求都需要提供足够的信息来验证用户的身份。

我们可以通过下面的表格来对比两者。

直接客户端 Direct clients = Web Service / 接口认证间接的客户端(Indirect clients)= UI 程序
认证流程每次 HTTP 请求都携带凭证1、原请求地址保存在 session;2、用户跳转到身份供应中心;3、进行登录;4、用户跳转到回调地址;5、返回原请求地址
登录多少次?每次 HTTP 请求都要。性能方面考量,可以设置缓存登录一次即可
凭据在哪里?每次 HTTP 请求身份提供者的回调
用户信息保存在哪里?每次 HTTP 请求(无状态的)Session(有状态的)

在这里插入图片描述
P.S 关于各种安全认证协议,Pac4j 作者有篇博文介绍得非常好。

Pac4j 把常见的登录认证过程抽象成为这两大类,不得不说是其一种创新,对比 Spring Secuity 就没有了。OAuth, CAS, SAML or OpenID Connect 这类协议都是间接客户端,所以都有一个回调地址。如果用户认证登录成功,那么将由回调地址来发起一次跳转,跳转到目标应用程序中。

支持的客户端

Pac4j 支持下面的客户端:

OAuth protocol
SAML protocol
CAS protocol
OpenID Connect protocol
HTTP protocol
Google App Engine support
Kerberos (SPNEGO Negotiate) protocol

虽然大多数客户端都是独立可用的,但 HTTP 客户端需要定义一个认证器(Authenticator) 来处理凭证校验。

客户端(如授权器 authorizers 和匹配器 matcher)通常在安全配置(security configuration)中定义。

每个客户端都有一个以类名作为默认的名称(如 FacebookClient),但可以使用 setName 方法将其显式设置为另一个值。

代码体系

Pac4j 扩展性强,代码清晰,耦合性低,非常不错。
在这里插入图片描述
在这么多体系的情况下 ,通过 Context 完成整体容器的协调 , 在通过 RedirectAction 做统一的 请求重定向。

依赖

Pac4j 依赖很少,有下面这些。

  • bcprov-jdk15on Bouncy Castle 是一个开源的密码学库,提供了广泛的加密算法实现,包括但不限于 AES、DES、RSA、DSA、ECDSA 等,以及用于生成和验证数字签名的功能
  • jBCrypt 使用 Blowfish 加密算法,不可逆的加密算法,无法通过解密哈希值来获取明文密码
  • Nimbus JOSE + JWT 用于处理 JSON Web Tokens (JWT)
  • ScribeJava 简单易用的 OAuth 客户端库,它支持 OAuth 1.0a 和 OAuth 2.0 协议,帮助开发者轻松集成第三方认证服务,如 Facebook、Google、Twitter、LinkedIn 等

用户信息 User Profile

在身份验证成功后,你需要从身份验证服务器中提取用户信息,并将其存储在你的应用程序中。这通常涉及到编写代码来获取和解析用户信息。这些已认证的用户信息在 Pac4j 中以UserProfile子类呈现,包括各种的实现例如 FacebookUserProfile、CasUserProfile 等等。

间接客户端的用户信息存储在 Session中;而直接客户端的用户信息存储在每次 HTTP 请求中。

用户信息包括:

  • 用户信息唯一标识
  • 用户属性(例如性别、姓名等)
  • 用户的角色、权限

获取用户信息的几种手段:

  • 当前 HTTP 请求,在 Pac4j 中是 WebContext
  • SessionStore,在 Session 中获取
  • ProfileManager 组件

例子

在这里插入图片描述

Authenticator 认证器

Authenticator 认证器用于客户端认证身份。所谓认证所需的元素就在这个接口方法中:

 void validate(Credentials credentials, WebContext context, SessionStore sessionStore)

如果一个 client 成功认证了那么就会抛出一个HttpAcion来中止 web 流程,然后跑去跳转(也可以其他的动作)。

内置的 Authenticator 如下。
在这里插入图片描述

Credentials 凭据

凭据的校验,由客户端的认证器(Authenticator)进行校验。分两类:

  • UsernamePasswordCredentials
  • TokenCredentials

所有客户端都有其内置的、默认的认证器执行凭据的校验,根据不同的安全协议,但是除了 HTTP 客户端,它不包括认证器。因为 HTTP 只知道如何获取凭据(例如从参数获取、从 http 头获取等等),而不知道接下来怎么干,于是就需要特定的认证器来完成凭据的校验。例如

在这里插入图片描述

另外,其子类 ProfileService不仅验证用户身份,还进行用户信息的创建、更新和删除。

用户的角色权限由AuthorizationGenerator获取。匿名用户使用 AnonymousClient 自动“认证”(其实意思是不用认证),这时候须使用 isAnonymous and isAuthenticated 的授权器。

同一个 URL,可以让多个 client 来认证,例如微信认证、微博认证,默认是这个 list 的第一个。你也可以通过force_client指定一个。

Authorizer 授权器

Authorizer 基于网页上下文信息和用户信息进行权限验证,例如 RequireAnyRoleAuthorizer,,RequireAllRolesAuthorizer,CheckProfileTypeAuthorizer,,CsrfAuthorizer 等。

Logout 登出

登出可以在应用程序本地执行或者在认证中心执行

Matcher 匹配器

Matcher 匹配器定义安全性是否必须应用于安全过滤器。例如某些 URL 开放、某些 URL 须认证保护,自定义安全头等(X-Frame-Options、Strict-Transport-Security)。

Config 配置器

客户端、授权器和匹配器联合一起定义安全配置

ProfileCreator 自定义身份验证

如果你需要自定义身份验证流程,pac4j 提供了丰富的扩展点,你可以编写自己的身份验证提供者。

相关文章:

Pac4j 学习笔记

随着互联网技术的飞速发展,网络安全问题日益凸显,企业信息安全与身份认证系统变得越来越重要,而且安全认证集成方案作为保障网络安全的重要一环,其研究与应用也至关重要。在这种背景下,Pac4j 作为一种流行的身份验证库…...

什么?RayLink远程控制软件支持企业IT应用!

在当今企业IT管理中,远程控制工具扮演着不可或缺的角色。设想一下,你的团队成员分散在全球各地,或者员工正在远程工作,这时电脑突然出现问题。如果IT支持团队能够利用远程控制软件,比如RayLink,迅速远程接入…...

LeetCode Hot100 51~60

图论51. 岛屿问题52. 腐烂的橘子53. 课程表54. 前缀树55. 全排列56. 子集57. 电话号码58. 组合总和59. 括号生成60. 单词搜索 图论 51. 岛屿问题 经典洪水问题算法 class Solution { public:int numIslands(vector<vector<char>>& grid) {int nr grid.size…...

docker 启动 redis 同时设置密码,关机后会自动重启

以下是使用Docker启动Redis并设置密码&#xff0c;并配置容器自动重启的命令&#xff1a; docker run -d \--name redis \--restartalways \-p 6379:6379 \redis:latest \redis-server --requirepass "your_strong_password"详细解释&#xff1a; docker run -d&am…...

3D Gaussian Splatting代码详解(一):模型训练、数据加载

1.模型训练 训练流程&#xff1a;train.py中的training函数 这段代码实现了一个 3D 高斯模型的训练循环&#xff0c;旨在通过逐步优化模型参数&#xff0c;使其能够精确地渲染特定场景。以下是代码的详细解析&#xff1a; def training(dataset, opt, pipe, testing_iteratio…...

docker部署RustDesk自建服务器

客户端&#xff1a; Releases rustdesk/rustdesk GitHub 服务端&#xff1a; 项目官方地址&#xff1a;GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库&#xff1a; docker pu…...

工作实战总结与实现-mybatis-plus更新策略部分字段不更新问题

文章目录 案例场景存在问题解决方案一解决方案二继续延伸 案例场景 很简单的工作场景&#xff0c;需要将数据库某个表的字段设置为null或者空字符串&#xff0c;使用mybatis-plus的update语句&#xff0c;如下&#xff1a; order.setPassCode(null);reservationOrderManger.up…...

MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了&#xff0c;这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…...

Midjourney Describe API 的对接和使用

Midjourney Describe API 的对接和使用 Midjourney Describe API 的主要功能是通过上传图片&#xff0c;获取对图片的描述。使用该 API&#xff0c;只需要传递图片文件地址&#xff0c;API 会返回图片的详细描述。无需繁琐的参数设置&#xff0c;即可获得高质量的图片描述。 …...

《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编

1.整体框架&#xff1a;1-22题&#xff08;17-20为编程题分别源自数中的P98,P162,P177页&#xff09; 2.简答题部分&#xff1a; 3.计算题...

Qt入门9——绘图

基本概念 虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景. 很多时候我们需要更强的"DIY"能力&#xff1b; Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计。 绘图api核心类&#xff1a; 类说明QPaint…...

FreeRTOS之ARM CR5栈结构操作示意图

FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…...

Java线程的interrupt中断、wait-notify/all(源码级分析)

实例方法&#xff1a; interrupt()方法是设置结束阻塞(sleep、)&#xff0c;并且设置中断标记true isInterrupted()判断当前是否中断 静态方法&#xff1a; Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好&#xff0c;既然上面的方法作用是清晰的&…...

计网408考点讲解

IPv4...

当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库

解决方法&#xff1a; ldd 命令来验证程序是否加载了正确的库&#xff1a; 如检查linear_elasticity可执行文件缺少的库&#xff0c;用下面命令&#xff1a; ldd linear_elasticity 可以发现下面not found就是缺少的库&#xff0c;还有对应的库的位置已经版本 $ ldd lin…...

文件下载的几种方式

1、使用window.open方法 url: 可以为文件存放的地址 function downloadFile(url) {window.open(url); }2、使用<a>标签进行文件下载 <a href"/多因素登录说明文档.pdf" class"link-text">说明文档</a> 3、使用fetch和Blob对象 这种…...

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...

访问http网页强制跳转到了https的解决办法

目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因&#xff1a;HSTS&#xff08;HTTP Strict Transport Security&#xff09;什么是 HSTS&#xff1f;HSTS 的工作原理 如何解决&#xff1f;1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息&#xff1a;在 Firef…...

3D 生成重建016-SA3D从nerf中分割一切

3D 生成重建016-SA3D从nerf中分割一切 文章目录 0 论文工作1 方法介绍2 实验结果 0 论文工作 1 SAM的背景和目标&#xff1a; SAM 是一种强大的二维视觉基础模型&#xff0c;能够在 2D 图像中进行任意物体的分割。传统上&#xff0c;SAM 在二维空间表现出色&#xff0c;但其无…...

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程&#xff1a; 用户在浏览器输入域名URL&#xff0c;例如www.baidu.com。 不过&#xff0c;浏览器并不知道为该域名提供服务的服务器具…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...