对于任何有一定规模的系统而言,登录认证系统都是不可或缺的。登录认证实现方式众多,包括账密、社会化登录、OAuth2、LDAP 等,且各系统的登录认证往往功能重复。JustAuthPlus(JAP),就是一套灵活泛用的登录认证中间件。

简介
JustAuthPlus(简称 JAP),是 fujieid 在Gitee上开源的登录认证中间件,仓库位于 ,目前版本为 v1.0.7。
JAP 基于 模块化设计 ,为所有需要登录认证的 WEB 应用提供一套标准的技术解决方案,开发者可以基于 JAP 适配绝大多数的 WEB 系统(自有系统、联邦协议),简单方便。

使用
JAP 简单易用,具有以下特性:
- 易用性 :JAP 的 API 沿袭 JustAuth 的简单性,做到了开箱即用的程度。JAP 高度抽象各种登录场景,提供了多套简单使用的 API,极大程度的降低了开发者的学习成本和使用成本
- 全面性 :JAP 全量适配 JustAuth 支持的第三方平台,实现第三方登录。同时也支持所有基于标准 OAuth2.0 协议或者 OIDC 协议或者 SAML 协议的应用、系统,同时 JAP 还提供不同语言版本的项目 SDK,适配多种研发场景
- 模块化 :JAP 基于模块化设计开发,针对每一种登录场景,比如账号密码、 OAuth 、OIDC等,都单独提供了独有的模块化解决方案
- 标准化 :JAP 和业务完全 解耦 ,将登录认证相关的逻辑抽象出一套标准的技术解决方案,针对每一种业务场景,比如用户登录、验证密码、创建并绑定第三方系统的账号等,都提供了一套标准的策略或者接口,开发者可以基于 JAP,灵活并方便的完成相关业务逻辑的开发和适配
- 通用性 :JAP 不仅可以用到第三方登录、OAuth授权、OIDC认证等业务场景,还能适配开发者现有的业务系统的普通账号密码的登录场景,基本将所有登录相关的业务场景都已经涵盖。针对 WEB 应用,JAP 将提供满足各种不同登录场景的解决方案(和开发语言无关)
JAP功能丰富,包括:

JAP 适用于所有需要登录功能的场景。比如:
- 标准规范 :新项目立项,你们需要研发一套包含登录、认证的系统,并且需要一套标准的、灵活的、功能全面的登录认证功能。
- 需求灵活 :现有登录模块为自研,但是新一轮的技术规划中,你们想将登录认证模块重构,以更加灵活的架构适应后面的新需求,比如:集成 MFA 登录、集成 oauth 登录、SAML登录等。
- 力求省事 :你们的项目太多(或者是开发语言较多,比如: Java 、 Python 、Node 等),每个项目都需要登录认证模块,想解决这种重复劳动的问题,使研发人员有更多的时间和精力投入到业务开发中,提高研发产能和研发效率。
- …
JAP使用模块化设计,分别提供不同功能。
jap-simple 是为了方便快速的集成本地账号密码登录而添加的增强包。使用前添加依赖:
<dependency>
<groupId>com.fujieid</groupId>
<artifactId>jap-simple</artifactId>
<version>{latest-version}</version>
</dependency>
然后实现 JapUserService 接口:
import com.fujieid.jap.core.JapUser;
import com.fujieid.jap.core.JapUserService;
public class JapSimpleUserServiceImpl implements JapUserService {
@Override
public JapUser getByName(String username) {
return new JapUser()
}
@Override
public boolean validPassword(String password, JapUser user) {
return user.getPassword().equals(password);
}
}
并实现登录的Controller,就能获得一个账号密码登录功能:

jap-oauth2 是为了方便快速的集成所有支持标准 OAuth 2.0 协议的平台而添加的增强包,添加依赖
<dependency>
<groupId>com.fujieid</groupId>
<artifactId>jap-oauth2</artifactId>
<version>{latest-version}</version>
</dependency>
实现 JapUserService 接口
public class JapOauth2UserServiceImpl implements JapUserService {
/**
* 根据第三方平台标识(platform)和第三方平台的用户 uid 查询数据库
*
* @param platform 第三方平台标识
* @param uid 第三方平台的用户 uid
* @return JapUser
*/
@Override
public JapUser getByPlatformAndUid(String platform, String uid) {
return null;
}
/**
* 创建并获取第三方用户,相当于第三方登录成功后,将授权关系保存到数据库
* (开发者业务系统中 oauth2 user -> sys user 的绑定关系)
*
* @param platform 第三方平台标识
* @param userInfo 第三方返回的用户信息
* @param tokenInfo token 信息,可以强制转换为 com.fujieid.jap.oauth2.token.AccessToken
* @return JapUser
*/
@Override
public JapUser createAndGetOauth2User(String platform, Map <String, Object> userInfo, Object tokenInfo) {
// FIXME 业务端可以对 tokenInfo 进行保存或其他操作
AccessToken accessToken = (AccessToken) tokenInfo;
System.out.println(JsonUtil.toJsonString(accessToken));
// FIXME 注意:此处仅作演示用,不同的 oauth 平台用户id都不一样,
// 此处需要开发者自己分析第三方平台的用户信息,提取出用户的唯一ID
String uid = (String) userInfo.get("userId");
// 查询绑定关系,确定当前用户是否已经登录过业务系统
JapUser japUser = this.getByPlatformAndUid(platform, uid);
if (null == japUser) {
// 保存用户
japUser = createJapUser();
japUser.setAdditional(userInfo);
userDatas.add(japUser);
}
return japUser;
}
}
总结
JustAuthPlus作为一个登录认证中间件,其基于模块化设计,为所有需要登录认证的 WEB 应用提供一套标准的技术解决方案,开发者可以基于 JAP 适配绝大多数的 WEB 系统,简单方便。