上下文定义
Maven坐标
<dependency>
<groupId>com.ikingtech.framework</groupId>
<artifactId>sdk-context</artifactId>
</dependency>
上下文配置与使用说明
常量定义类
1.CommonConstants.java
:该类定义了通用的常量,包括系统配置,部门和组织的默认ID和名称等。
常量 | 常量释意 |
---|---|
GLOBAL_CONFIG_PREFIX | iking.framework |
ROOT_DEPT_ID | 默认部门 |
ROOT_ORG_ID | root |
ROOT_ORG_NAME | 默认组织 |
/*
* 默认语言环境
*/
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前缀等。
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
租户删除事件,当一个租户被删除时会触发此事件。
使用流程
使用方式
🙅注意
下面的仅是使用示例,不代表所有用法。
- 通过pom文件引入依赖。
<dependency>
<groupId>com.ikingtech.platform</groupId>
<artifactId>sdk-context</artifactId>
</dependency>
- 使用安全处理类
- 示例:
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());
}
}
在这个例子中,创建了一个新的用户身份,并设置其属性。然后我们切换到另一个数据源,并获取当前用户的名字和权限范围
- 使用事件类
当系统初始化和租户删除时,可以派发 SystemInitEvent 和 TenantDeleteEvent 事件,其他系统组件可以监听这些事件并做出相应处理。
- 示例:
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框架下所有监听这两种事件的监听器(如果有的话)都会收到相应的通知,并执行相关操作。