PAC4J 新手入门,之一(概述及准备)

什么是 pac4j

pac4j 是一个简单而强大的安全框架,用于 Java 验证用户、获取用户配置文件和管理授权,以保护 web 应用程序和 web服务。

它提供了一套全面的概念和组件。它适用于大多数框架/工具,并支持大多数认证和授权机制。它的开源授权协议为 Apache 2。

在 Java Web 项目开发中,涉及到用户认证时,我们可以选用 pac4j 框架进行对接,以减少开发工作量。而由于 pac4j 本身支持了很多认证协议,如 OAuth2.0、OIDC、CAS、SAML2等,所以我们更倾向于,当我们的项目需要作为认证协议客户端,对接相应协议时使用 pac4j 框架,以减少对接工作量。

pac4j 资料

pac4j 官方网站:网站

pac4j 中文文档地址:中文

pac4j 英文文档地址:英文

pac4j GitHub 地址:GitHub

pac4j 邮件列表:邮件列表

知识准备

阅读此 pac4j 新手指南,需要读者具有以下相关知识:

  1. 基本的 Java 语言知识(包括 Java 8 中引入的 Lambda)
  2. 会 Spring Boot 项目,并具有基本的 Spring Boot 项目知识
  3. 常用 IDE 软件的使用经验,如 IntelliJ IDEA
  4. Maven 基础知识(熟悉 Gradle 也可)

pac4j 的版本

pac4j 目前分为三个主线版本,分别为:4.X5.X6.X,分别对应的 JDK 版本为:JDK 8JDK 11JDK 17

使用时我们需要按照自己项目依赖的 JDK 版本进行选择。

相关软件、框架

指南将使用 Spring BootSpring Security 演示 pac4j 的使用,相关工具、软件、框架的版本如下表:

软件/框架 版本号
JDK 17.0.5
IntelliJ IDEA 社区版 2022.3.1
Maven IntelliJ IDEA 内嵌
Spring Boot 2.7.7
Spring Security 2.7.7
pac4j 5.7.0

指南虽然使用 JDK 17,但选择 Spring Boot 版本为 2.7.7,pac4j 版本为 5.7.0。如果使用其他版本,需要注意相关的配套关系。

使用的框架版本中,如果存在 Lombok 依赖,还需要 IntelliJ IDEA 需要安装 Lombok 插件。

指南使用的是 IntelliJ IDEA 的社区版,不支持 Spring Boot 相关的开发特性,我们需要安装插件 Spring Boot Assitant 方便开发。如果你使用的是 IntelliJ IDEA 专业版,则无需安装此插件。

初始化项目

我们在 IntelliJ IDEA 中新建一个 Maven 项目,并修改 pom.xml 以适配 Spring Boot,构建一个使用 Spring BootSpring Security 的基础项目。

  1. pom.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.7</version>
        <relativePath/>
    </parent>

    <groupId>tech.bookhub</groupId>
    <artifactId>pac4j-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>pac4j-demo</name>
    <description>pac4j demo project for Spring Boot.</description>

    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  1. application.yml
yaml 复制代码
server:
  port: 8888

spring:
  security:
    user:
      name: admin
      password: bookhub

以上 application.yml 文件意图为:指定 tomcat 以端口 8888 运行,并配置一个用户 admin,密码为 bookhub

  1. Pac4jApplication.java
java 复制代码
package tech.bookhub;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Pac4jApplication {
    public static void main(String[] args) {
        SpringApplication.run(Pac4jApplication.class, args);
    }
}
  1. IndexController.java
java 复制代码
package tech.bookhub.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

    @GetMapping("/")
    public String index() {
        return "index ok";
    }
}

项目结构如下图:

然后我们运行项目后,可以通过浏览器访问 http://localhost:8888/,首次访问将会跳转到 Spring Security 的默认认证界面,我们输入用户名 admin,密码 bookhub,如下图:

认证成功后,我们即可获得路径 / 的响应 index ok,如下图:

以上 Demo 代码见 GitHub,Demo 0

相关推荐
copyer_xyf1 小时前
Agent RAG
后端·python·agent
copyer_xyf1 小时前
【RAG】向量数据库:milvus
后端·python·agent
铁皮饭盒1 小时前
Bun 哪比 Node.js 快?
javascript·后端
copyer_xyf1 小时前
Agent 记忆管理
后端·python·agent
葫芦和十三8 小时前
图解 MongoDB 02|BSON:你以为存的是 JSON,其实是带类型的二进制
后端·mongodb·agent
葫芦和十三8 小时前
图解 MongoDB 01|文档数据库
后端·mongodb·agent
陈随易10 小时前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人12 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
candyTong12 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
Rust研习社14 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言