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并设置密码,并配置容器自动重启的命令: docker run -d \--name redis \--restartalways \-p 6379:6379 \redis:latest \redis-server --requirepass "your_strong_password"详细解释: docker run -d&am…...

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

docker部署RustDesk自建服务器
客户端: Releases rustdesk/rustdesk GitHub 服务端: 项目官方地址:GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库: docker pu…...

工作实战总结与实现-mybatis-plus更新策略部分字段不更新问题
文章目录 案例场景存在问题解决方案一解决方案二继续延伸 案例场景 很简单的工作场景,需要将数据库某个表的字段设置为null或者空字符串,使用mybatis-plus的update语句,如下: order.setPassCode(null);reservationOrderManger.up…...

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

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

《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编
1.整体框架:1-22题(17-20为编程题分别源自数中的P98,P162,P177页) 2.简答题部分: 3.计算题...

Qt入门9——绘图
基本概念 虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景. 很多时候我们需要更强的"DIY"能力; Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计。 绘图api核心类: 类说明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(源码级分析)
实例方法: interrupt()方法是设置结束阻塞(sleep、),并且设置中断标记true isInterrupted()判断当前是否中断 静态方法: Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好,既然上面的方法作用是清晰的&…...

计网408考点讲解
IPv4...
当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库
解决方法: ldd 命令来验证程序是否加载了正确的库: 如检查linear_elasticity可执行文件缺少的库,用下面命令: ldd linear_elasticity 可以发现下面not found就是缺少的库,还有对应的库的位置已经版本 $ 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,简称 T-BOX,也称远程信息处理控制单元(Telematics Control Unit, TCU),集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...
访问http网页强制跳转到了https的解决办法
目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因:HSTS(HTTP Strict Transport Security)什么是 HSTS?HSTS 的工作原理 如何解决?1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息:在 Firef…...

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

阿里云整理(二)
阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程: 用户在浏览器输入域名URL,例如www.baidu.com。 不过,浏览器并不知道为该域名提供服务的服务器具…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...