Skip to content

上下文定义

Maven坐标

xml
<dependency>
    <groupId>com.ikingtech.framework</groupId>
    <artifactId>sdk-context</artifactId>
</dependency>

上下文配置与使用说明


常量定义类

1.CommonConstants.java:该类定义了通用的常量,包括系统配置,部门和组织的默认ID和名称等。

常量常量释意
GLOBAL_CONFIG_PREFIXiking.framework
ROOT_DEPT_ID默认部门
ROOT_ORG_IDroot
ROOT_ORG_NAME默认组织
java
/*
 * 默认语言环境
 */
public static final String ENV_DEFAULT_LANG = Locale.SIMPLIFIED_CHINESE.toLanguageTag();
public static final Integer JOB_HANDLER_REPORT_RUNNER_ORDER = 1880930;
public static final Integer MESSAGE_TEMPLATE_BEAN_DEFINITION_REPORT_RUNNER_ORDER = 1880932;
public static final Integer LOG_CONSUMER_RUNNER_ORDER = 1880935;
public static final Integer AUTHENTICATION_FILTER_ORDER = 1880936;
public static final Integer SECURITY_FILTER_ORDER = 1880937;

2.SecurityConstants.java:该类定义了安全相关的常量,例如header中的各种标识信息,token前缀等。

java
public static final String HEADER_ENV_LANGUAGE = "X-ENV-LANGUAGE";
public static final String HEADER_VERSION = "X-VERSION";
public static final String HEADER_TENANT_CODE = "X-TENANT";
public static final String HEADER_MENU_ID = "menu-id";
public static final String HEADER_CALLER = "x-caller";
public static final String INNER_CALLER = "inner";
public static final String HEADER_IDENTITY = "x-identity";
public static final String TOKEN_PREFIX = "Bearer ";
public static final String GLOBAL_TOKEN = TOKEN_PREFIX + "iking";
public static final String DEFAULT_TENANT_CODE = "MASTER";
public static final String DEFAULT_TENANT_NAME = "默认租户";
public static final String GLOBAL_MENU_ID = "global";
public static final LocalDateTime DEFAULT_PASSWORD_MODIFY_TIME = LocalDateTime.of(1970, 1, 1, 12, 0, 0);

安全处理类

  • DataSourceContext:

    数据源上下文,用于管理线程级别的数据源切换。

    提供了get()和remove()两个静态方法。用于切换数据源,和删除数据源

  • Identity:

    表征一个用户身份的类,包含了用户的各种属性如id, username, password等等。

    内部存在defaultUser()和admin() 方法,用于对系统管理员的相关字段进行赋值。

  • Me:

    提供了关于当前在线用户的查询方法,如获取当前在线用户的id,用户名,是否为管理员等。

方法释意
set(Identity value)设置当前线程的Identity
clear()清除当前线程的Identity
id()获取当前线程用户的ID
username()_ 获取当前线程用户的用户名_
name()获取当前线程用户的名称
tenantCode()获取当前线程用户的租户代码
lang()获取当前线程用户的语言
isAdmin()判断当前线程的用户是否是管理员
info()获取当前线程的用户信息
dataScope()获取当前线程用户的数据范围(权限码)
dataScope(List<
String> queryCodes)
过滤出当前用户数据范围(权限码)中包含在查询列表中的元素
extension(String key)获取当前线程用户扩展信息中对应键值的内容
extension()获取当前线程用户的全部扩展信息
dataScope(String queryCode)通过queryCode过滤和匹配数据权限码,管理员返回空集合,非管理员但无数据权限码、或未成功匹配时返回invalid_data_scope。并进行处理转换为部门全路径的最后一个元素(以"@"分割)
invalidDataScope(List<
String> dataScopeCodes)
检查提供的数据范围(权限码)列表是否包含无效的数据范围

事件类

  • SystemInitEvent

    系统初始化事件,当系统启动时会触发此事件。它包含了事件的一些基本信息,如租户代码、用户ID、用户名等。当系统初始化时,可以创建并发布这个事件,以便其他组件或服务进行相应的处理。

  • TenantDeleteEvent

    租户删除事件,当一个租户被删除时会触发此事件。

使用流程


使用方式

🙅注意

下面的仅是使用示例,不代表所有用法。

  1. 通过pom文件引入依赖。
xml
<dependency>
    <groupId>com.ikingtech.platform</groupId>
    <artifactId>sdk-context</artifactId>
</dependency>
  1. 使用安全处理类
  • 示例:
java
import com.example.security.DataSourceContext;
import com.example.security.Identity;
import com.example.security.Me;

public class SomeClass {
    public void someMethod() {
        Identity identity = new Identity();
        identity.setId(1L);
        identity.setUsername("admin");
        identity.setPassword("password");

        //切换数据源
        DataSourceContext.switchTo("datasource2");

        //多用于获取当前登陆用户的相关信息
        System.out.println(Me.name());
        System.out.println(Me.dataScope());
    }
}

在这个例子中,创建了一个新的用户身份,并设置其属性。然后我们切换到另一个数据源,并获取当前用户的名字和权限范围

  1. 使用事件类

当系统初始化和租户删除时,可以派发 SystemInitEvent 和 TenantDeleteEvent 事件,其他系统组件可以监听这些事件并做出相应处理。

  • 示例:
java
import com.example.events.SystemInitEvent;
import com.example.events.TenantDeleteEvent;
import org.springframework.context.ApplicationEventPublisher;

public class SomeClass {
    // Spring 框架中用于发布事件的接口
    private final ApplicationEventPublisher eventPublisher;

    //通过参数将 ApplicationEventPublisher 的实例传入,并保存在 eventPublisher 字段中
    public SomeClass(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void someMethod() {
        eventPublisher.publishEvent(new SystemInitEvent(this));
        eventPublisher.publishEvent(new TenantDeleteEvent(this, "tenant1"));
    }
}

当调用 someMethod 方法时,系统将首先触发并发布 SystemInitEvent 事件,然后触发并发布带有参数 "tenant1" 的 TenantDeleteEvent 事件。发布事件后,Spring框架下所有监听这两种事件的监听器(如果有的话)都会收到相应的通知,并执行相关操作。