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 提供了丰富的扩展点,你可以编写自己的身份验证提供者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933308.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5G CPE组成及功能介绍(二)

5G CPE 组成及功能介绍 5G CPE 将5G信号转换为Wi-Fi或有线信号, 其由5G基带芯片、主控处理器、WIFI、电源、天线、结构等多个部件组成。5G基带: 这是5G CPE中最核心的组件,负责接收和解码来自5G基站的信号,然后将这些数据转换成用户设备可以使用的格式。采用了先进的5G芯片…

微服务-seata分布式事务

1.简述 1.1.什么是分布式事务 事务:是应用程序中一系列严密的操作,所有操作必须成功完成,要么全部失败,ACID 特性。本地事务:关系型数据库中,由一组SQL组成的一个执行单元,该单元要么整体成功,要么整体失败&#xff…

flyway执行sql遇到变量执行报错解决

前两天在公司使用flyway工具执行sql时,开发写的sql里面有变量,于是这个flyway工具不识别这个变量直接报错,不接着往下执行了。报错信息如下: flyway工具执行sql报错 information: No value provided for placeholder: ${ep1} 于是…

k8s 为什么需要Pod?

Pod,是 Kubernetes 项目中最小的 API 对象,更加专业的说,Pod,是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着,Kubernetes 项目的调度器,是统一按照 Pod 而非容器的资…

IDEA 鼠标悬浮显示方法注释 javaDoc 及配置遇到的问题

方法详情: 鼠标悬浮时的效果: 设置方法: File -> Settings -> Editor -> Code Editing -> Quick Documentation,勾选红框中的选项 可能会遇到的问题: 如果不能选中,如下图 把下图的位置的选中项取消掉 选…

vscode CMakeLists中对opencv eigen的引用方法

CMakeLists.txt 项目模式(只有一个main函数入口) cmake_minimum_required(VERSION 3.5)project(vsin01 VERSION 0.1 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)set(OpenCV_DIR G:/MinGW_Opencv/opencv4.10/opencv…

cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)

今天更新了某个抖音小游戏的版本,增加了部分剧情,半天过后一条短信审核未通过,emmm…抖音总是能给开发者惊喜…打开电脑看看这次又整什么幺蛾子… 首先是一脸懵逼,后端早已接入了官方的内容安全检测能力了(https://de…

基于单片机的中小水电站闸门控制系统(论文+源码)

1 系统总体设计 本次基于单片机的中小水电站闸门控制系统的设计,整体结构如图2.1所示。整个系统包括stm32单片机最小系统,电源,液晶,电机,闸门开度检测模块,水位检测模块,温度传感器&#xff0…

证明网络中的流形成一个凸集

证明网络中的流形成一个凸集 步骤1:定义和符号步骤2:线性组合步骤3:验证容量限制步骤4:验证流量守恒结论示例代码(C语言) 在网络流理论中,一个流 f f f 是定义在网络图的边集上的一种函数&…

【贪心算法】贪心算法五

贪心算法五 1.跳跃游戏 II2.跳跃游戏3.加油站3.单调递增的数字 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.跳跃游戏 II 题目链接&…

计算机毕业设计Python医疗问答系统 医疗可视化 BERT+LSTM+CRF深度学习识别模型 机器学习 深度学习 爬虫 知识图谱 人工智能 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

QT 中 sqlite 数据库使用

一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …

总结的一些MySql面试题

目录 一&#xff1a;基础篇 二&#xff1a;索引原理和SQL优化 三&#xff1a;事务原理 四&#xff1a;缓存策略 一&#xff1a;基础篇 1&#xff1a;定义&#xff1a;按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享 的…

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…

什么是分库?分表?分库分表?

分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;所谓“分库分表”&#xff0c;根本不是一回事&#xff0c;而是三件事&#xff0c;他们要解决的问题也都不一样。 这三个事分别是“只分库不分表”、“只分表不分库”、以…

前端常用缓存技术深度剖析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

A3026 Java+jsp+servlet+mysql高校学生请假管理系统

高校学生请假管理系统 1.摘要2. 绪论3.功能结构4.界面展示5.源码获取 1.摘要 高校学生请假管理系统 摘要&#xff1a;随着计算机的发展与不断进步&#xff0c;各个领域都出现了新的技术&#xff0c;曾经各种规模之间的竞争已经发展成为技术之间的竞争&#xff0c;管理和人才之…

机器学习周报(12.2-12.8)

文章目录 摘要Abstract Vision Transformer1 原理2 代码 摘要 本周学习了Vision Transformer (ViT) 的基本原理及其实现&#xff0c;并完成了基于PyTorch的模型训练、验证和预测任务。深入理解了ViT如何将图像分割成patch作为输入序列&#xff0c;并结合Transformer Encoder处…

Jmeter Address already in use: connect 解决

做压测接口时&#xff0c;并发一段时间后&#xff0c;会报java.net.BindException: Address already in use: connect 原因&#xff1a; windows提供给TCP/IP链接的端口为 1024-5000&#xff0c;并且要四分钟来循环回收它们&#xff0c;就导致在短时间内跑大量的请求时将端口占…

深入解析 HTML Input 元素:构建交互性表单的核心

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…