# Java 开源组织 Dromara

返回:java 开源

# Sa-Token

Sa-Token

可能是史上功能最全的轻量级 Java 权限认证框架。
简单的使用方式,丰富的特性,强大的功能

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证权限认证Session会话单点登录OAuth2.0微服务网关鉴权等一系列权限相关问题。

Sa-Token 的 API 设计非常简单

// 在登录时写入当前会话的账号id
StpUtil.login(10001);
// 然后在需要校验登录处调用以下方法:
// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常
StpUtil.checkLogin();
1
2
3
4
5

权限认证示例(只有具备 user:add 权限的会话才可以进入请求)

@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
  // ...
  return "用户增加";
}
1
2
3
4
5
6

将某个账号踢下线(待到对方再次访问系统时会抛出 NotLoginException 异常)

// 使账号id为 10001 的会话强制注销登录
StpUtil.logoutByLoginId(10001);
1
2

在 Sa-Token 中,绝大多数功能都可以 一行代码 完成:

StpUtil.login(10001);                     // 标记当前会话登录的账号id
StpUtil.getLoginId();                     // 获取当前会话登录的账号id
StpUtil.isLogin();                        // 获取当前会话是否已经登录, 返回true或false
StpUtil.logout();                         // 当前会话注销登录
StpUtil.logoutByLoginId(10001);           // 让账号为10001的会话注销登录(踢人下线)
StpUtil.hasRole("super-admin");           // 查询当前账号是否含有指定角色标识, 返回true或false
StpUtil.hasPermission("user:add");        // 查询当前账号是否含有指定权限, 返回true或false
StpUtil.getSession();                     // 获取当前账号id的Session
StpUtil.getSessionByLoginId(10001);       // 获取账号id为10001的Session
StpUtil.getTokenValueByLoginId(10001);    // 获取账号id为10001的token令牌值
StpUtil.login(10001, "PC");               // 指定设备标识登录,常用于“同端互斥登录”
StpUtil.logoutByLoginId(10001, "PC");     // 指定设备标识进行强制注销 (不同端不受影响)
StpUtil.openSafe(120);                    // 在当前会话开启二级认证,有效期为120秒
StpUtil.checkSafe();                      // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常
StpUtil.switchTo(10044);                  // 将当前会话身份临时切换为其它账号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Forest

Forest

一款极大程度解放你的 HTTP 接入工作的强大 HTTP 客户端框架

它能够将 HTTP 的请求参数绑定到 Java 接口上,之后调用 Java 接口就等于在发送 HTTP 请求。一切面向于接口


/**
 * 高德地图服务客户端接口
 */
@BaseRequest(baseURL = "http://ditu.amap.com")
public interface Amap {

    /**
     * 根据经纬度获取详细地址
     * @param longitude 经度
     * @param latitude 纬度
     * @return 详细地址信息
     */
    @Get("/service/regeo")
    Map getLocation(@Query("longitude") String longitude, @Query("latitude") String latitude);

}
......

Amap amap = Forest.client(Amap.class);
// 发送请求查询经纬度
Map locationInfo = amap.getLocation("32.1242832", "56.3290434");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

用 Forest 就方便多了,比如要 POST 一个 JSON 对象,直接挂个 @JSONBody 就好了,就是这么清爽。

// 直接将 MyUserInfo 转换成 JSON
// 将服务端响应返回的 JSON 数据转换成 Result<Boolean> 类对象
@Post("http://localhost:8080/user")
Result<Booelean> createUser(@JSONBody MyUserInfo user);
1
2
3
4

# 和 Retrofit 以及 Feign 的比较

Retrofit 的主要的问题时和 OkHttp 绑的太死,有些功能被 OkHttp 限制住了,比如我想处理 Get 请求传输 Body 数据这种非标准的 HTTP 请求就很难办到,而 Forest 可以随意切换 OkHttp 和 HttpClient 作为后端,需要用哪个时用哪个。

Retrofit 注解的丰富性也不如 Forest,比如要实现 HTTP 网络代理就要自己去写代码,而 Forest 提供了 @HTTPProxy 注解,设置一下就完事了。

如果要扩展自定义注解都是基于 OkHttp 的拦截器,不是特别方便,而 Forest 拦截器要比 OkHttp 的方便很多,提供 onInvoke, beforeExecute, onSccuess, onError 等回调方法,等于把一个请求的生老病死都涵盖了。

而 Feign 的问题则是和 Spring 绑的太紧,很多功能需要依赖 Spring 去做,太加了 Spring 相关包又太重了

Forest 的核心包基本涵盖了所有 HTTP 所需功能和注解,不依赖 Spring,要轻量许多,但又不失方便性。

# LiteFlow

LiteFlow

一款超轻量,快速,稳定,可编排的组件式流程引擎/规则引擎
解耦复杂系统的神器!如果你正在为设计一个复杂系统感到头痛,那么 LiteFlow 是你不二的选择

Liteflow 为解耦复杂逻辑而生,如果你要对复杂业务逻辑进行新写或者重构,用 liteflow 最合适不过。它是一个轻量,快速的组件式流程引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。

使用 LiteFLow,三大核心概念是组件,规则和上下文。

  • 你需要这么像这样去定义你的组件:
//这里普通组件
@LiteflowComponent(id = "a", name = "组件A描述")
public class ACmp extends NodeComponent {
    @Override
    public void process() {
        //do your business
    }
}

//这是条件组件
@LiteflowComponent(id = "b", name = "组件B描述")
public class BCondCmp extends NodeCondComponent {
    @Override
    public String processCond() {
        //do your business
        return "e";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 然后去定义你的规则,LiteFlow 支持 XML,yml,JSON 三种格式。这里以 XML 形式为例:
<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <chain name="chain1">
        <then value="a,b(c|d|e)"/> <!-- c为路由组件,用来路由到c,d,e -->
        <then value="sub_chain"/> <!-- 子流程 -->
    </chain>

   <chain name="sub_chain">
        <when value="f,g,h"/> <!-- when代表并行 -->
       <then value="j,k" /> <!-- then代表串行 -->
    </chain>
</flow>
1
2
3
4
5
6
7
8
9
10
11
12

那规则文件定义在哪呢,LiteFlow 并不限定你的规则文件来源,可以是本地文件,可以是注册中心,可以是任何数据库。LiteFlow 提供了非常自由的接口供你扩展,你想存储在哪里都行。改变规则文件,即可实时刷新你的规则流程!如果你想做一个灵活度高,伸缩性强的系统,LiteFlow 是不是非常适合呢?

LiteFlow 为每一个请求都去开辟申请了一个 Slot,你可以理解为上下文,所有的组件共享这个 Slot。你可以在任意组件里通过对 Slot 的访问来获得任意数据,也可以存放任意数据。你也可以扩展 Slot,自定义这个 Slot 的属性。

@LiteflowComponent(id = "a", name = "组件A描述")
public class ACmp extends NodeComponent {
    @Override
    public void process() {
        Slot slot = this.getSlot();
        //通过对slot的getData,setData,或者存取你自己扩展的slot属性
    }
}
1
2
3
4
5
6
7
8

正因为有 Slot 的存在,才抹平了组件与组件之间的差异性,使得每一个业务组件之间无强依赖。这样的设计,就可以让你的系统高度自由化,组件复用,组件调换顺序得以方便的实现!

你可以在 xml/yml/json 定义脚本,以下以 XML 为例:

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <nodes>
        <node id="s1" name="普通脚本" type="script">
            <![CDATA[
                def a=3;
                def b=2;
                slot.setData("s1",a*b);
            ]]>
        </node>

        <node id="s2" name="条件脚本" type="cond_script">
            <![CDATA[
                count = slot.getData("count");
                if(count > 100){
                    return "a";
                }else{
                    return "b";
                }
            ]]>
        </node>
    </nodes>

    <chain name="chain1">
        <then value="a,b,c,s1"/>
    </chain>

    <chain name="chain2">
        <then value="d,s2(a|b)"/>
    </chain>
</flow>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# JPom

JPom

一款简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件。

Jpom 是一款简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件。

在中小公司或者团队中传统项目部署、运维流程通用的方法是登录服务器上传新的项目包,执行相应命令管理,如果管理多个项目则重复操作上述步骤。

市面上有很许多 DevOps 软件但是这些软件基本都会是难上手,重依赖。Jpom 则是针对中小公司或者团队设计的一款低侵入,轻依赖的一款轻量级的 DevOps 软件。

# 项目主要功能及特点

  • 创建、修改、删除项目、Jar 包管理;
  • 实时查看控制台日志、备份日志、删除日志、导出日志;
  • 在线构建项目发布项目一键搞定;
  • 多节点管理、多节点自动分发;
  • 在线 SSH 终端,并且有终端日志和禁用命令;
  • 实时监控项目状态异常自动报警;
  • CPU、内存监控、导出堆栈信息、查看项目进程端口、服务器状态监控;
  • 多用户管理,用户项目权限独立(上传、删除权限可控制),完善的操作日志;
  • 系统路径白名单模式,杜绝用户误操作系统文件;
  • 在线管理 Nginx 配置文件、SSL 证书文件。

# 一键安装(Linux)(推荐)

# Cubic

Cubic

一站式问题定位平台!线程栈监控、线程池监控、动态 arthas 命令集、依赖分析等等等

线程栈监控、线程池监控、动态 arthas 命令集、依赖分析等等等,致力于应用级监控,帮助开发人员快速定位问题。

# Sureness

Sureness

丢掉 Shiro 吧,也别再用 Spring Security 了。简单易用多语言多框架支持,基于 RESTAPI 的强大国产鉴权框架,效率神器!

对现存框架,不原生支持 RESTful 的 Apache Shiro,还是深度绑定 Spring 的 Spring Security,或多或少都不是我们的理想选型。

Sureness 是我们在深度使用 Apache Shiro 之后,吸取其优点全新设计开发的一个认证鉴权框架。

  • 面向 REST API 的认证鉴权,基于 RBAC(用户-角色-资源)主要关注于对 API 的安全保护。无特定 Web 框架依赖,开箱即用(已有 SpringBoot、Quarkus、Javalin、Ktor、Micronaut、Jfinal、Solon 等集成样例);
  • 支持动态修改权限配置(动态修改配置每个 API 的访问权限)
  • 支持 Websocket 、主流 HTTP 容器 Servlet、JAX-RS、Spring Reactive;
  • 支持多种认证策略 JWT、Basic Auth、Digest Auth ... 可扩展自定义认证方式;
  • 基于改进的字典匹配树拥有的高性能;
  • 良好的扩展接口、样例和文档,帮助急速理解、扩展与使用 Sureness 的低配置;
  • 易扩展,不耦合其他框架,希望能对系统多场景快速安全的保护。

# TLog

TLog

十分钟即可接入,一款神器的日志框架。支持众多的框架和主流 RPC,让你的日志马上升级,变得可追溯!

# ImageCombiner

ImageCombiner

无需 P 图,用 Java 也能合成很好看的图,简单的使用方式,服务端批量合图利器!

素材上支持图片、文本、矩形三种,支持元素的定位、缩放、旋转、圆角、透明度、颜色、字体、字号、删除线、居中绘制、文本自动换行等特性,足够覆盖图片合成的日常需求。项目不依赖任何框架,完全基于 JDK 本身编写,没有各种花里胡哨的东西,性能还是相当不错的。


public void simpleDemo() throws Exception {

    //合成器
    ImageCombiner combiner = new ImageCombiner("http://xxx.com/image/bg.jpg", OutputFormat.JPG);

    //加图片元素
    combiner.addImageElement("http://xxx.com/image/product.png", 0, 300)
        .setAlpha(.8 f) //透明度(0.0~1.0)
        .setRotate(45) //旋转(0~360)
        .setBlur(20); //高斯模糊(1~100);

    //加文本元素
    combiner.addTextElement("周末大放送", 0, 150, 1400)
        .setCenter(true) //居中绘制(会忽略x坐标,改为自动计算)
        .setColor(Color.Red) //颜色

    //执行图片合并
    combiner.combine();

    //可以获取流(并上传oss等)
    InputStream is = combiner.getCombinedImageStream();

    //也可以保存到本地
    combiner.save("d://image.jpg");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# MaxKey

TIP

MaxKey 单点登录认证系统是业界领先的企业级 IAM 身份管理和认证框架,产品化程度很高,多家知名公司的选择!

MaxKey 单点登录认证系统(Single Sign On System)。谐音马克思的钥匙,寓意是最大钥匙。是业界领先的企业级 IAM 身份管理和认证产品。支持 OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM 等标准协议。提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC 权限管理和资源管理等。

  • 提供标准的认证接口以便于其他应用集成 SSO,安全的移动接入,安全的 API、第三方认证和互联网认证的整合;
  • 提供用户生命周期管理,支持 SCIM 2 协议,基于 Apache Kafka 代理,通过连接器(Connector)实现身份供给同步;
  • 认证中心具有平台无关性、环境多样性。支持 Web、手机、移动设备等。如 Apple iOS、Andriod 等。将认证能力从 B/S 到移动应用全面覆盖;
  • 多种认证机制并存,各应用系统可保留原有认证机制,同时集成认证中心的认证;应用具有高度独立性,不依赖认证中心,又可用使用认证中心的认证,实现单点登录;
  • 基于 Java EE 平台,采用 Spring、MySQL、Tomcat、Redis、Apache Kafka 等开源技术,微服务架构,扩展性强;
  • 开源、安全、自主可控,许可证 Apache 2.0 License & MaxKey 版权声明。