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。 不过,浏览器并不知道为该域名提供服务的服务器具…...

qt基本部分控件用法(一)
前言: 以前 windows下做工具主要是MFC,趁有点空时间,研究了QT,感觉跟MFC 差不多,VS 比 QT CREATOR 还是强大,不过QT可以跨平台,功能更强大,MFC 只能在win平台下.; 1:环境…...

【Linux】环境ChatGLM-4-9B 模型之 openai API 服务
一、摘要 最近看到 Function Call 比较感兴趣,它的核心是赋予大模型能够调用外部API的能力,能够解决大模型功能扩展性问题,允许模型调用外部数据库或API,提供特定领域的详细信息;解决信息实时性问题,模型可以实时获取最新数据;解决数据局限性问题,大模型训练数据虽多但…...

Too many open files 问题处理
某个简单的 python 服务,运行一段时间就崩溃。查看日志后发现有一个系统错误 OSError: Errno24 Too many open files要理解这个问题,首先要理解什么是文件描述符,可以参考我的另一篇文章(Linux 系统文件描述符(File Descriptor&a…...

CentOS 7 环境下常见的操作和配置
目录 1. CentOS 7 中的 vsftpd 配置与使用 安装与启动 vsftpd 配置 vsftpd(/etc/vsftpd/vsftpd.conf) 常见命令 2. 使用 yum 包管理器 3. 安全性与防火墙配置 开放端口 4. 使用 systemd 管理服务 5. SELinux 配置 查看 SELinux 状态 临时禁用…...

HTTP(超文本传输协议)
HTTP是万维网通信的基础构成,是一个简单的请求相应协议,基于TCP之上80号端口 通信原理 DNS解析 将域名甩个DNS服务器解析,将域名化为IP访问 建立TCP连接 如图,客户端先发送一个sys置位seq为x(任意值)的…...

etcd-v3.5release-(3)-readIndexRead
笔记1:读操作包括两种,readIndex和serilizable,readIndex指一致性读,一旦a读到了数据x,那么a及a以后的数据都能读到x,readIndex读会先确认本leader是不是有效地leader,如果有效则记录此刻的comm…...

IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置
NA消息用单播还是多播的判断理由 单播回复(Unicast): 如果客户端发送 RS 消息时,使用的是一个全局地址或链路本地地址作为源地址,则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量,…...

C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数
知识要点:数组作函数参数 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序,前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...

PostgreSQL数据库连接:psqlODBC驱动安装与配置实战指南
本文还有配套的精品资源,点击获取 简介:本文将提供详细的psqlODBC驱动程序在Windows操作系统上的安装和配置指南,使用户能够通过ODBC标准连接到PostgreSQL数据库。安装步骤涵盖获取安装文件、运行安装向导、选择安装路径、完成安装以及配置…...

【NLP 8、normalization归一化函数:sigmoid、softmax】
目录 Normalization(归一化) 1.特点 目的 应用场景 输出范围 2. Sigmoid 函数 目的 应用场景 输出范围 3. Softmax 函数 目的 应用场景 输出范围 "燃尽最后的本能,意志力会带你杀出重围" —— 24.12.2 Normalization&#…...