用户相关
# 用户相关
# 用户信息
// 代码中获取用户id
UserContext.getUserId();
// 代码中获取更多用户信息
UserContext.getUserInfo();
2
3
4
5
# mock用户
给一个默认的用户, 无需登录就可以使用的, application.yml, 可以配置mock用户的基本信息
配置完成后, 在请求头加固定的认证即可, 后面获取的用户信息都是mock
# 无需用户认证
很多的接口为了给第三方调用, 并且不用登录的情况
说明:
这里配置具体的接口名称
一个 * 匹配一个位置
多个 * 匹配一个或多个位置
# 用户过期时间
# 登录
# 根据账号密码登录
/loginByPwd
这是页面上默认的登录方法
2
请求参数
{
"userName": "tgroot",
"password": "PON86nyVNQACBX9xO9HUoLKeIkIXAh43rhPyagcdCqODV88fe6nuKrgiEX+4lT6gIvhhuWrFGozLfWZAWVK1yausd7ZZ8yq04zwIRavjdefAcgfY3HJqGOZJpdG4O43jn0Pd2XJHSKGoOEqK+cICjti+OsywmRHNd2ZyopcThZU=",
"sys": "MAIN",
"uuid": "5Z3vLu4MojR4xqJ48Gjvp",
"valCode": "a5df"
}
2
3
4
5
6
7
参数说明
字段 | 说明 |
---|---|
userName | 登录用户名 |
password | 加密后的密码 |
sys | 系统菜单标识码(默认就是MAIN) |
uuid | 验证码的uuid |
valCode | 验证码的值 |
说明:
这个接口是前端直接调用后端的, 密码是加密好的, 后端如果模拟掉这个方法, 密码需要自己加密, 加密方法: RsaBase64Utils.encrypt(xxx)
valCode为验证码的值, 框架默认了一个固定的9527, 比如小程序或不需要验证码登录的情况, 可以写死9527, 也可以自定义方案
/**
* @author tingjie.dou
* @date 2024/5/20 15:23
* @desc 自己写一个类, 实现EciValCodeAware接口, 记得用@Component, 将类注入到ioc容器中
*/
@Component
public class MyValCodeCheckAware implements EciValCodeAware {
/**
* 自定义验证码校验逻辑
* @param sys 当前系统, 如: MAIN
* @param code 前端传入的验证码的值
* @return true表示校验通过, false表示校验失败
*/
@Override
public boolean doCheckValCode(String sys, String code) {
// 伪代码, 如果是微信小程序, 直接返回ture, 后面就不用验证uuid, 和 验证码了
if ("WXXCX".equals(sys)){
return true;
}
// 返回false,后面会走验证uuid 验证码的逻辑
return false;
}
}
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
# 其他登录方式
- 依赖注入userLoginService
@Autowired
private UserLoginService userLoginService;
2
- 调用下面相关的方法
// 根据token切换系统
LoginInfo loginByToken(ChangeSysAo ao);
// 根据权限平台token登录
LoginInfo loginBySsoToken(ChangeSysAo ao);
// 根据用户id获取用户以及菜单信息
LoginInfo getLoginInfoByUserId(String userId,String system);
// 根据用户loginNo获取用户以及菜单信息
LoginInfo getLoginInfoByLoginName(String loginName,String system);
// 根据用户mail获取用户以及菜单信息
LoginInfo getLoginInfoByMail(String mail,String system);
2
3
4
5
6
7
8
9
10
11
12
13
14
# token相关
token是前端访问后端的令牌, 相当于手持车票才能上车, 开发过程中会涉及到两个token
- token: 天宫框架的token(全名: Authorization), 在请求的时候必须加在请求头上面的
- ssoToken: 权限平台的token, 在不同项目间跳转免登录的时候会用到
# 天宫框架token(Authorization)
格式
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2ODdkMDlhZjcxYTc0Zjk3YTJiNGE4ODU2YWUxOWNjZCIsInN1YiI6IjM2YjRjODFlYzY3NDJmOTZkMGUxYzU5NTMyMTRiNTJhIiwiaWF0IjoxNzA5NTQzMzM5fQ.5NlVWpoeHM7eeuJ-MOjfY7uN7PtQhH0l7JJdnDv-nn4
说明:
这是一个JWT工具生成的token, 每次登录成功后, 会在响应里面给出来token
{
"code": 10002,
"msg": "操作成功",
"success": true,
"traceId": "e175f80c4a8f45dfbe77ae42c44fbf1d",
"data": {
"userInfo": {
// 用户信息省略 ...
},
"menuInfo": {
// 菜单信息省略 ...
},
"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2MTYzNTY0YjgwMzY0MjhjYjk2Y2NhN2M4NTRjZmI3ZSIsInN1YiI6IjRjNWE2ODQyNTgxMGFhYTY2MjY3ODRjNjNiMTRmMGExIiwiaWF0IjoxNzA5ODc4MzczfQ.B6wSQPD9gvfcVA9t1fIbGSfak9Tps4DAuHcE-_S4w0M"
},
"extendData": null,
"cacheVersion": "20240307160845"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
登录成功后会保存在redis中:
框架为了方便管理, 会加一个前缀 TG_SSO_TOKEN:
TG_SSO_TOKEN:eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2ODdkMDlhZjcxYTc0Zjk3YTJiNGE4ODU2YWUxOWNjZCIsInN1YiI6IjFjNWE2NTY1ZDYyZDA0MGU0ZGY3MTVhY2EyZjJkMjMyIiwiaWF0IjoxNzA5NTMxMTI2fQ.kchZXrP-bL1SazVXOcn43YgqGaUXwsSd4SdQUHjoV7s
# 权限平台token(ssoToken)
格式
9470c7ddfc4744eda1405eb9e91b9094
说明:
这个token是由权限平台生成的, 登录成功后会在用户信息内返回
{
"code": 10002,
"msg": "操作成功",
"success": true,
"traceId": "e175f80c4a8f45dfbe77ae42c44fbf1d",
"data": {
"userInfo": {
"userId": "6163564b8036428cb96cca7c854cfb7e",
// 省略部分字段 ...
// 权限平台token
"ssoToken": "ddf338f78a7a494686b1755baf7e1806"
},
"menuInfo": {
// 菜单信息省略 ...
},
// 天宫框架token
"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2MTYzNTY0YjgwMzY0MjhjYjk2Y2NhN2M4NTRjZmI3ZSIsInN1YiI6IjRjNWE2ODQyNTgxMGFhYTY2MjY3ODRjNjNiMTRmMGExIiwiaWF0IjoxNzA5ODc4MzczfQ.B6wSQPD9gvfcVA9t1fIbGSfak9Tps4DAuHcE-_S4w0M"
},
"extendData": null,
"cacheVersion": "20240307160845"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# loginByToken
两个系统, 都使用同一个权限平台, 使用天宫框架的token完成 天宫框架登录
URL
/loginByToken
参数:
{
"sys":"ECIGW",
"token":"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIwNWI0ZjgyNmJkMDchZDVhZDExZSI.Ga7FCq5_SgNNyxviy31KtAk_bVg4kxc9vsgczuX2Smwdsf"
}
2
3
4
说明
sys: 系统标识, 获取菜单的时候要用到, 在application-dev.yml中有
token: 天宫框架token, 一般前端localStorage中会存储该信息
# loginBySsoToken
两个系统, 都使用同一个权限平台, 使用权限平台的token完成 天宫框架登录
URL
/loginBySsoToken
参数:
{
"sys": "MAIN",
"token": "9470c7ddfc4744eda1405eb9e91b9094"
}
2
3
4
说明
sys: 系统标识, 获取菜单的时候要用到, 在application-dev.yml中有
token: 权限平台token, 一般是前端跳转的时候带过来的
# 免token访问后台接口
很多时候, 系统需要让外部系统访问或者方便调试, 不使用token也能使用
在配置文件 application.yml 中添加排除信息
project:
token:
exclude: /appGen/selectPageList
2
3
说明:
需要排除多个, 用英文逗号隔开
project: token: exclude: /appGen/selectPageList,/appGen/export
1
2
3通配符匹配一个或多个路径
project: token: # 匹配一个路径 exclude: /appGen/*,/appGen/export --------------------------------------------------- project: token: # 匹配多个路径 exclude: /appGen/**,/appGen/export
1
2
3
4
5
6
7
8
9
10
11
# token有效期
框架默认的token有效期是一个小时, 当然有的系统需要更长的时间, 都是可以自己设置的
project:
token:
exclude:
# 设置有效期, 这里单位是秒
ttl: 3600
2
3
4
5
# H4A集成
# 2. 主启动类加上注解
@SpringBootApplication
@EnableH4aLogin
public class MainApplication{
}
2
3
4
5
# 3. 获取权限平台的菜单目录树
控制台启动后有链接, 浏览器请求后可以直接下载 menu.json
http://localhost:[端口]/h4a/downMenuTree/MAIN
将文件放在resource/config/ 下面
# 4. resource目录下添加配置文件
resource资源目录下建一个文件夹, config, 将以下两个文件放入
生产环境如果需要修改, 建议外置h4a配置文件, 在jar包同级目录建一个config文件夹, 将这两个文件放入
给两个文件示范, 以南京体检为例, 简称NJTJ
# h4a-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<application>
<module name="h4aIdentity">
<group name="wsCache">
<!-- cacheControl 值为off为开启缓存,值为on为关闭缓存 -->
<configValue key="cacheControl">on</configValue>
<!--cacheTime和cacheClearTime值为缓存设置的参数,默认值即可-->
<configValue key="cacheTime">300000000</configValue>
<configValue key="cacheClearTime">1</configValue>
<!--initialDelay和clearCachePeriod参数默认值即可,无需修改-->
<configValue key="initialDelay">0</configValue>
<configValue key="clearCachePeriod">1440</configValue>
</group>
</module>
<module name="passportSSO">
<group name="passport">
<!--appID是应用的ID号-->
<configValue key="appID">ZSCQ</configValue>
<!--appSlidingTime是应用的过期时间-->
<configValue key="appSlidingTime">0</configValue>
<!--idAuthenticationMode是系统支持(要求)认证返回的认证模式-->
<!--参数值forms是表单认证-->
<configValue key="idAuthenticationMode">forms</configValue>
<!--paramT参数默认值即可,无需修改-->
<configValue key="paramT">token</configValue>
<!--defaultAuthenticationMode是默认认证方式-->
<!--formsAuthentication是表单认证-->
<configValue key="defaultAuthenticationMode">FormsAuthentication</configValue>
</group>
<group name="url">
<!-- logoffAutoRedirect参数即注销是否允许自动跳转 -->
<configValue key="logoffAutoRedirect">false</configValue>
<!--请修改为应用系统的主页访问地址,实际地址为应用的相对访问路径,如http://localhost:8080/default/login.jsp,应填写为/login.jsp -->
<configValue key="logoffToDefaultUriString"></configValue>
<!-- logOffCallBackUrl的uri是注销回调地址 -->
<configValue key="logOffCallBackUrl">/h4a/logout</configValue>
<!-- H4A登录时,如有多个身份,如需选择某个身份登录,选择身份页面配置,例:/sso/selectIdentity.jsp -->
<configValue key="select_identity_page"> </configValue>
</group>
<group name="defaultAuthenticationMode">
<configValue key="*.jpg">Anonymous</configValue>
<!-- 默认值即可-->
<configValue key="*.gif">Anonymous</configValue><!--默认值即可-->
<configValue key="/anonymous.html">Anonymous</configValue><!--默认值即可-->
<!--WindowsAuthentication是域认证,默认值-->
<configValue key="/WindowsAuthentication/*.jsp">WindowsAuthentication</configValue>
<configValue key="/WindowsAuthentication/test*">WindowsAuthentication</configValue>
</group>
<!-- 不需passport filter拦截的页面在次配置,没有不拦截页面,configValue key="url"的值为空 -->
<group name="notInterceptUrl">
<!-- start , end , center三种选择 -->
<configValue key="position">start</configValue>
<!-- 多个情况下,中间使用","分隔 -->
<configValue key="url"></configValue>
<!-- URL解密实现方法,继承cn.gov.customs.casp.sdk.h4a.sso.IPassportDecryption -->
<configValue key="decryption"></configValue>
</group>
</module>
<module name="SSOAddress">
<group name="ssoAddress">
<!-- 海关H4AIPassportSSO接口实现类相对路径,如不继承IPassportSSO接口则不用填写实现类路径 -->
<!-- 如果配置了自己应用的登录登出,可在自己应用中放入个性化登录数据、信息等, 例如test.cn.gov.customs.ssoDemo.PassPortSSO;请根据实际情况判断是否实现此接口 -->
<configValue key="PassportManager"></configValue>
</group>
</module>
<module name="h4a_default">
<group name="wcf_default">
<configValue key="default_cache_max_capacity">10000</configValue><!--默认值-->
<configValue key="default_BaseView">CCIC_VIEW</configValue><!--基本视觉-->
<configValue key="default_Application_nam">NJTJ</configValue><!--应用名称-->
<configValue key="orgValue">中国海关\\南京海关</configValue><!--应用名称-->
<!--<configValue key="orgValue">海关总署</configValue>-->
</group>
<group name="Intercepter_load_switch">
<configValue key="Intercepter_Control">false</configValue><!--默认值即可-->
</group>
</module>
<module name="object_param">
<!-- FrameworkUserInit.initUserObject 中使用的动态配置参数:getBeanObjectsDetail_lastParam为 oguBeanReaderHelper.getBeanObjectsDetail最后一个参数;organizationCategory_lastParam为iOguBeanReader.getBeanObjectParentOrganizations最后一个参数 -->
<group name="parameter_obj">
<configValue key="getBeanObjectsDetail_lastParam">PERSON_ID,SIDELINE</configValue>
<configValue key="organizationCategory_lastParam">CUSTOMS_CODE</configValue>
</group>
</module>
</application>
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# sdk-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<application>
<module name="h4aIdentity">
<!-- 海关H4A接口服务地址示例,以下为示例地址。请按照实际环境进行配置,请与H4A人员联系 -->
<group name="wsAddress">
<!-- 身份服务:OguReaderService;授权服务:AccreditReaderService;应用注册服务:RegisterAppService -->
<configValue key="OguReaderService">http://192.168.202.101/CupaaCenterService/OguReaderService.svc</configValue>
<configValue key="AccreditReaderService">http://192.168.202.101:8085/CupaaDistributedService/AccreditReaderService.svc</configValue>
<configValue key="RegisterAppService">http://192.168.202.101/AppRegisterService/RegisterAppReaderService.svc</configValue>
</group>
</module>
<module name="passportSSO">
<!-- 海关H4A单点登录地址示例,以下为示例地址。请按照实际环境进行配置 -->
<group name="url">
<!--示例: H4A供参考-->
<!-- authenticateUrl uri是认证地址-->
<configValue key="authenticateUrl">http://192.168.202.101/Passport/SsoLogin.aspx</configValue>
<configValue key="logOffUrl">http://192.168.202.101/Passport/LogOff.aspx</configValue>
</group>
</module>
</application>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 前端集成
# 文件 .env
# 登录启用 H4A
VITE_TG_LOGIN_H4A = 'true'
# H4A 访问的前端地址: 如果访问地址有变更,请配置如下字段
VITE_H4A_URL = 'http://localhost:60002/#/login'
2
3
4
5
# 注意事项
- 公司权限平台无需部署
- 权限平台的菜单树如有更新, 需要一起更新menu.json
- 用户数据从H4A获取
# 扩展功能
框架给开发人员提供了很多扩展的钩子方法供开发人员去实现
- 登录回调
UserInfoAware接口
- loginPostProcessor 登录成功的回调, 可以做一些动作, 比如发送邮件, 记录日志...
- loginFailPostProcessor 登录失败的回调
- logoutPostProcessor 退出登录的回调
2
3
4