订阅注册
# 开始
# 一、新建接口类
首先完成在PC端配置之后,需要创建自己的接口,接口的地址为你在订阅注册时候填写的地址,这里需要注意,这个接口应当是开放的,接口的鉴权应当由接口内部实现,你框架层面需要放开拦截
例如 http://127.0.0.1:8080/sinuo/urm/receiveUrmInfo 请求方式是为post 首先需要依赖pom文件 当前jar包在公司私服,暂时未开放,需要的话可以找开发索要,然后上传到自己私服即可,后续也考虑放在公网服务中
<dependency>
<groupId>com.scsoft</groupId>
<artifactId>auth-sso-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
1
2
3
4
5
6
2
3
4
5
6
如果不依赖这个,单点也需要自己实现,上面这个pom是单点登录实现的基础包,里面包含所有的两个UrmUserBean ,UrmDepartBean ,下面我也会贴出来改文件,接入方可自行创建
接入jar包之后,需要提供接口,接口里面需要引入appid和appSecret,这两个是在注册时候颁发的,如果是springboot项目可以通过配置文件中配置 然后通过@value进行引入,也可以自行配置 接入之后可以调用AppSignUtil.signAppSecret(appId,appSecret,businessKey,request)进行校验 下面是我提供的一个简单示例,并不适用与接入方的项目,需要根据自己的业务改造,具体以接入时调试为主,
关于加密传输 使用的是SM4基于hutool的工具类实现的加密解密,可以参考hutool的加解密方法
// 除了hutool工具包 还需要额外引入,具体使用请参考hutool
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
1
2
3
4
5
2
3
4
5
示例接口
@RestController
@RequestMapping("/sinuo/urm")
public class SinuoUrmController {
// 运维支撑部门id
private static String departId = "";
@Value("${sinuo.appId}")
public String appId;
@Value("${sinuo.appSecret}")
public String appSecret;
@Resource
private IDepartService departService;
@Resource
private IUserService userService;
@Resource
private IRoleService roleService;
@RequestMapping("receiveUrmInfo")
public JsonResult receiveUrmInfo(HttpServletRequest request, String urmType, String businessKey, String data, String handleType,String isSecret) {
System.out.println("*******接收统一资源" + urmType + "信息********");
System.out.println(businessKey);
System.out.println(handleType);
System.out.println(data);
boolean flag= AppSignUtil.signAppSecret(appId,appSecret,businessKey,request);
if (!flag){
return JsonResult.error("签名错误");
}
if (StringUtils.isNotBlank(data)) {
if (isSecret.equals("1")){
String combined = appId + appSecret;
byte[] key = DigestUtil.md5(combined.getBytes());
SM4 sm4 = SmUtil.sm4(key);
byte[] decryptData = sm4.decrypt(Base64.decode(data));
String decryptStr = new String(decryptData);
//System.out.println("解密结果: " + decryptStr);
data=decryptStr;
}
if ("insert".equals(handleType) || "update".equals(handleType)) {
if ("depart".equals(urmType)) {
UrmDepartDto dto = JSONObject.parseObject(data, UrmDepartDto.class);
// 获取上级机构
LambdaQueryWrapper<Depart> ew = new LambdaQueryWrapper<>();
// ew.eq(Depart::getOtherId, dto.getPOrg());
ew.eq(Depart::getId, dto.getPOrg());
ew.last("limit 1");
Depart pDepart = departService.getOne(ew);
Depart depart = new Depart();
depart.setDepartName(dto.getDepartName());
depart.setDescription((pDepart == null ? "" : (pDepart.getDescription()) + "-") + dto.getDepartName());
depart.setOrgType("0");
depart.setDepartOrder(String.valueOf(dto.getDepartOrder()));
depart.setDepartLevel(dto.getDepartLevel());
depart.setId(dto.getCOrg());
depart.setAddress(dto.getAddress());
// depart.setOtherPId(dto.getPOrg());
depart.setParentId(pDepart == null ? "-1": dto.getPOrg());
depart.setOrgCode(dto.getOrgCode());
depart.setOtherId(dto.getCOrg());
// 简单粗暴,有则更新,无则添加
Depart departQuery = departService.getById(dto.getCOrg());
if (departQuery == null) {
departService.save(depart);
} else {
LambdaUpdateWrapper<Depart> updateEw = new LambdaUpdateWrapper<>();
updateEw.eq(Depart::getId, dto.getCOrg());
departService.update(depart, updateEw);
}
} else if ("user".equals(urmType)) {
// UrmUserDto dto = JSONObject.parseObject(json.get("data").toString(), UrmUserDto.class);
UrmUserDto dto = JSONObject.parseObject(data, UrmUserDto.class);
// 获取所属机构
// TODO
Depart depart=departService.getOne(new LambdaQueryWrapper<Depart>()
.eq(Depart::getId, StringUtils.isNotBlank(departId) ? departId : dto.getCOrg()));
if (depart != null) {
User user = new User();
user.setUserName(dto.getUserName());
user.setRealName(dto.getRealName());
user.setUserNum(dto.getUserNum());
user.setSex(dto.getSex());
user.setStatus(0);
user.setAddress(dto.getAddress());
user.setUserType(0);
user.setUserOrder(dto.getUserOrder());
user.setRoles(getDefaultRoles());
user.setAddress(dto.getAddress());
user.setEmail(dto.getEmail());
user.setMobilePhone(dto.getMobilePhone());
//user.setExtData(dto.getExtData());
user.setOtherId(dto.getUniqueNo());
// 简单粗暴,有则更新,无则添加
User userQuery = userService.getByUsername(user.getUserName());
if (userQuery == null) {
// user.setId(dto.getId());
user.setId(IdWorker.getIdStr());
System.out.println("密码:" + Base64.decodeStr(dto.getPassword()));
user.setPassword(Base64.decodeStr(dto.getPassword()));
userService.add(user, depart.getId());
} else {
user.setId(userQuery.getId());
userService.update(user, depart.getId());
}
}
}
} else if ("delete".equals(handleType)) {
if ("depart".equals(urmType)) {
// 删除机构
// 删除机构下用户
} else if ("user".equals(urmType)) {
// 删除用户
UrmUserDto dto = JSONObject.parseObject(data, UrmUserDto.class);
userService.deleteByOtherId(dto.getUniqueNo());
}
}
}
return JsonResult.ok();
}
private List<Role> getDefaultRoles() {
// 默认角色:普通用户,code=102
LambdaQueryWrapper<Role> ew = new LambdaQueryWrapper<>();
ew.eq(Role::getCode, "102");
return roleService.list(ew);
}
}
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
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
d 注意:此处可设置用户要同步到的机构id,是为了方便测试推送用户,后续接入机构后,以推送的机构id为准
::: 切记接口一定为开放的,要不然无法完成调用 ::: warning
UrmDepartBean 代码示例
@Data
public class UrmDepartBean {
private String id;
private String poolId;
private String sourceDepartId;
private String departName;
private String cOrg;
private String pOrg;
private String description;
private String pOrgs;
private String orgCode;
private String orgType;
private String administrativeDivision;
private String address;
private Integer departOrder;
private String departLevel;
}
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
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
UrmUserBean 代码示例
@Data
public class UrmUserBean {
private String id;
private String poolId;
private String userName;
private String password;
private String realName;
private String sex;
private String birthDate;
private String mobilePhone;
private String address;
private String email;
private String userType;
private String status;
private String sectionAddr;
private String workTel;
private String workPost;
private String userOrder;
private String idCard;
private String secretLevel;
private String shortNo;
private String cOrg;
private String extData;
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
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