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.X、5.X 和 6.X,分别对应的 JDK 版本为:JDK 8、JDK 11 和 JDK 17。

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

相关软件、框架

指南将使用 Spring Boot 和 Spring 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 Boot 和 Spring 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。

相关推荐
学长毕设28 分钟前
基于SpringBoot的景点管理系统-附源码
java·spring boot·后端
sxlishaobin1 小时前
Maven Setting详解
java·学习·maven
知守观1 小时前
一个方法两个触发口:反编译 XXL-Job 后,我看清了 inner/job 子包的裸奔现状
java·spring boot·微服务
用户3126874877201 小时前
CompletableFuture 链式编排:异步编程的优雅解法
java
生锈的键盘2 小时前
从实战搞懂 Docker:一个 Python 项目的开发环境容器化笔记
后端
瑞雪兆丰年兮2 小时前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
神仙别闹2 小时前
基于 Java GUI 贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏
java·毕业设计·gui·贪心策略·极大极小博弈树
九零HTTP2 小时前
RFC 7230 把请求行分了四种,网关只用得上两种
后端
Flynn Liang3 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
SomeOtherTime3 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust