Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
yujianwangzivayy
MaxKey
提交
89ca99e1
MaxKey
项目概览
yujianwangzivayy
/
MaxKey
与 Fork 源项目一致
Fork自
MaxKey单点登录官方(MaxKeyTop) / MaxKey
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MaxKey
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
89ca99e1
编写于
1月 22, 2022
作者:
M
MaxKey
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dingtalk
上级
efda9101
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
137 addition
and
67 deletion
+137
-67
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/LoginCredential.java
...-core/src/main/java/org/maxkey/authn/LoginCredential.java
+48
-16
maxkey-core/src/main/java/org/maxkey/entity/OrganizationsCast.java
...re/src/main/java/org/maxkey/entity/OrganizationsCast.java
+6
-0
maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkOrganizationService.java
...ey/synchronizer/dingtalk/DingtalkOrganizationService.java
+40
-21
maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkUsersService.java
...rg/maxkey/synchronizer/dingtalk/DingtalkUsersService.java
+30
-28
maxkey-identitys/maxkey-synchronizers-workweixin/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java
...ynchronizer/workweixin/WorkweixinOrganizationService.java
+12
-1
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/AbstractSynchronizerService.java
.../org/maxkey/synchronizer/AbstractSynchronizerService.java
+1
-1
未找到文件。
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/LoginCredential.java
浏览文件 @
89ca99e1
...
...
@@ -42,6 +42,8 @@ public class LoginCredential implements Authentication {
String
provider
;
String
code
;
String
message
=
WebConstants
.
LOGIN_RESULT
.
SUCCESS
;
String
instId
;
ArrayList
<
GrantedAuthority
>
grantedAuthority
;
boolean
authenticated
;
...
...
@@ -211,20 +213,50 @@ public class LoginCredential implements Authentication {
this
.
message
=
message
;
}
@Override
public
String
toString
()
{
StringBuilder
builder
=
new
StringBuilder
();
builder
.
append
(
"LoginCredential [username="
).
append
(
username
)
.
append
(
", password="
).
append
(
"******"
)
.
append
(
", sessionId="
).
append
(
sessionId
)
.
append
(
", captcha="
).
append
(
captcha
)
.
append
(
", otpCaptcha="
).
append
(
otpCaptcha
)
.
append
(
", remeberMe="
).
append
(
remeberMe
)
.
append
(
", authType="
).
append
(
authType
)
.
append
(
", jwtToken="
).
append
(
jwtToken
)
.
append
(
", grantedAuthority="
).
append
(
grantedAuthority
)
.
append
(
", authenticated="
).
append
(
authenticated
)
.
append
(
"]"
);
return
builder
.
toString
();
}
public
String
getInstId
()
{
return
instId
;
}
public
void
setInstId
(
String
instId
)
{
this
.
instId
=
instId
;
}
@Override
public
String
toString
()
{
StringBuilder
builder
=
new
StringBuilder
();
builder
.
append
(
"LoginCredential [username="
);
builder
.
append
(
username
);
builder
.
append
(
", password="
);
builder
.
append
(
"******"
);
builder
.
append
(
", sessionId="
);
builder
.
append
(
sessionId
);
builder
.
append
(
", captcha="
);
builder
.
append
(
captcha
);
builder
.
append
(
", otpCaptcha="
);
builder
.
append
(
otpCaptcha
);
builder
.
append
(
", remeberMe="
);
builder
.
append
(
remeberMe
);
builder
.
append
(
", authType="
);
builder
.
append
(
authType
);
builder
.
append
(
", jwtToken="
);
builder
.
append
(
jwtToken
);
builder
.
append
(
", onlineTicket="
);
builder
.
append
(
onlineTicket
);
builder
.
append
(
", provider="
);
builder
.
append
(
provider
);
builder
.
append
(
", code="
);
builder
.
append
(
code
);
builder
.
append
(
", message="
);
builder
.
append
(
message
);
builder
.
append
(
", instId="
);
builder
.
append
(
instId
);
builder
.
append
(
", grantedAuthority="
);
builder
.
append
(
grantedAuthority
);
builder
.
append
(
", authenticated="
);
builder
.
append
(
authenticated
);
builder
.
append
(
", roleAdministrators="
);
builder
.
append
(
roleAdministrators
);
builder
.
append
(
"]"
);
return
builder
.
toString
();
}
}
maxkey-core/src/main/java/org/maxkey/entity/OrganizationsCast.java
浏览文件 @
89ca99e1
...
...
@@ -64,6 +64,12 @@ public class OrganizationsCast extends JpaBaseEntity implements Serializable {
private
String
orgId
;
@Column
private
String
orgParentId
;
@Column
private
String
appId
;
@Column
private
String
appName
;
@Column
private
String
instId
;
...
...
maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkOrganizationService.java
浏览文件 @
89ca99e1
...
...
@@ -17,6 +17,12 @@
package
org.maxkey.synchronizer.dingtalk
;
import
java.sql.Types
;
import
java.util.HashMap
;
import
java.util.NoSuchElementException
;
import
java.util.concurrent.LinkedBlockingQueue
;
import
org.maxkey.constants.ConstsStatus
;
import
org.maxkey.entity.Organizations
;
import
org.maxkey.synchronizer.AbstractSynchronizerService
;
import
org.maxkey.synchronizer.ISynchronizerService
;
...
...
@@ -34,47 +40,65 @@ import com.taobao.api.ApiException;
public
class
DingtalkOrganizationService
extends
AbstractSynchronizerService
implements
ISynchronizerService
{
final
static
Logger
_logger
=
LoggerFactory
.
getLogger
(
DingtalkOrganizationService
.
class
);
OapiV2DepartmentListsubResponse
rspDepts
;
String
access_token
;
public
void
sync
()
{
_logger
.
info
(
"Sync Organizations ..."
);
try
{
OapiV2DepartmentListsubResponse
rsp
=
requestDepartmentList
(
access_token
);
for
(
DeptBaseResponse
dept
:
rsp
.
getResult
())
{
_logger
.
info
(
"dept : "
+
dept
.
getDeptId
()+
" "
+
dept
.
getName
()+
" "
+
dept
.
getParentId
());
Organizations
org
=
buildOrganization
(
dept
);
this
.
organizationsService
.
merge
(
org
);
_logger
.
info
(
"Organizations : "
+
org
);
LinkedBlockingQueue
<
Long
>
deptsQueue
=
new
LinkedBlockingQueue
<
Long
>();
deptsQueue
.
add
(
1L
);
HashMap
<
Long
,
DeptBaseResponse
>
deptMap
=
new
HashMap
<
Long
,
DeptBaseResponse
>();
try
{
while
(
deptsQueue
.
element
()
!=
null
)
{
OapiV2DepartmentListsubResponse
rsp
=
requestDepartmentList
(
access_token
,
deptsQueue
.
poll
());
for
(
DeptBaseResponse
dept
:
rsp
.
getResult
())
{
_logger
.
info
(
"dept : "
+
dept
.
getDeptId
()+
" "
+
dept
.
getName
()+
" "
+
dept
.
getParentId
());
deptsQueue
.
add
(
dept
.
getDeptId
());
deptMap
.
put
(
dept
.
getDeptId
(),
dept
);
Organizations
organization
=
buildOrganization
(
dept
,
deptMap
.
get
(
dept
.
getParentId
()));
if
(
organizationsService
.
findOne
(
"id = ? and instid = ?"
,
new
Object
[]
{
organization
.
getId
().
toString
(),
organization
.
getInstId
()
},
new
int
[]
{
Types
.
VARCHAR
,
Types
.
VARCHAR
})
==
null
)
{
organizationsService
.
insert
(
organization
);
}
else
{
organizationsService
.
update
(
organization
);
}
_logger
.
info
(
"Organizations : "
+
organization
);
}
}
}
catch
(
ApiException
e
)
{
e
.
printStackTrace
();
}
catch
(
NoSuchElementException
e
)
{
_logger
.
debug
(
"Sync Department successful ."
);
}
}
public
OapiV2DepartmentListsubResponse
requestDepartmentList
(
String
access_token
)
throws
ApiException
{
public
OapiV2DepartmentListsubResponse
requestDepartmentList
(
String
access_token
,
Long
deptId
)
throws
ApiException
{
DingTalkClient
client
=
new
DefaultDingTalkClient
(
"https://oapi.dingtalk.com/topapi/v2/department/listsub"
);
OapiV2DepartmentListsubRequest
req
=
new
OapiV2DepartmentListsubRequest
();
req
.
setDeptId
(
1L
);
req
.
setDeptId
(
deptId
);
req
.
setLanguage
(
"zh_CN"
);
rspDepts
=
client
.
execute
(
req
,
access_token
);
OapiV2DepartmentListsubResponse
rspDepts
=
client
.
execute
(
req
,
access_token
);
_logger
.
info
(
"response : "
+
rspDepts
.
getBody
());
return
rspDepts
;
}
public
Organizations
buildOrganization
(
DeptBaseResponse
dept
)
{
public
Organizations
buildOrganization
(
DeptBaseResponse
dept
,
DeptBaseResponse
parentDept
)
{
Organizations
org
=
new
Organizations
();
org
.
setId
(
dept
.
getDeptId
()+
""
);
org
.
setCode
(
dept
.
getDeptId
()+
""
);
org
.
setName
(
dept
.
getName
());
org
.
setParentId
(
dept
.
getParentId
()+
""
);
org
.
setParentCode
(
dept
.
getParentId
()+
""
);
if
(
parentDept
!=
null
)
{
org
.
setParentName
(
parentDept
.
getName
());
}
org
.
setInstId
(
this
.
synchronizer
.
getInstId
());
org
.
setStatus
(
ConstsStatus
.
ACTIVE
);
org
.
setDescription
(
"dingtalk"
);
return
org
;
}
...
...
@@ -87,10 +111,5 @@ public class DingtalkOrganizationService extends AbstractSynchronizerService im
public
void
setAccess_token
(
String
access_token
)
{
this
.
access_token
=
access_token
;
}
public
OapiV2DepartmentListsubResponse
getRspDepts
()
{
return
rspDepts
;
}
}
maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkUsersService.java
浏览文件 @
89ca99e1
...
...
@@ -17,42 +17,44 @@
package
org.maxkey.synchronizer.dingtalk
;
import
java.sql.Types
;
import
java.util.List
;
import
org.apache.commons.lang3.StringUtils
;
import
org.joda.time.DateTime
;
import
org.joda.time.format.DateTimeFormat
;
import
org.maxkey.entity.Organizations
;
import
org.maxkey.entity.UserInfo
;
import
org.maxkey.synchronizer.AbstractSynchronizerService
;
import
org.maxkey.synchronizer.ISynchronizerService
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
com.dingtalk.api.DefaultDingTalkClient
;
import
com.dingtalk.api.DingTalkClient
;
import
com.dingtalk.api.request.OapiV2UserListRequest
;
import
com.dingtalk.api.response.OapiV2DepartmentListsubResponse
;
import
com.dingtalk.api.response.OapiV2UserListResponse
;
import
com.dingtalk.api.response.OapiV2DepartmentListsubResponse.DeptBaseResponse
;
import
com.dingtalk.api.response.OapiV2UserListResponse.ListUserResponse
;
@Service
public
class
DingtalkUsersService
extends
AbstractSynchronizerService
implements
ISynchronizerService
{
final
static
Logger
_logger
=
LoggerFactory
.
getLogger
(
DingtalkUsersService
.
class
);
@Autowired
DingtalkOrganizationService
dingdingOrganizationService
;
String
access_token
;
public
void
sync
()
{
_logger
.
info
(
"Sync Users..."
);
try
{
OapiV2DepartmentListsubResponse
rspDepts
=
dingdingOrganizationService
.
getRspDepts
();
for
(
DeptBaseResponse
dept
:
rspDepts
.
getResult
())
{
List
<
Organizations
>
organizations
=
organizationsService
.
find
(
"instid = ?"
,
new
Object
[]
{
this
.
synchronizer
.
getInstId
()
},
new
int
[]
{
Types
.
VARCHAR
});
for
(
Organizations
dept
:
organizations
)
{
DingTalkClient
client
=
new
DefaultDingTalkClient
(
"https://oapi.dingtalk.com/topapi/v2/user/list"
);
OapiV2UserListRequest
req
=
new
OapiV2UserListRequest
();
req
.
setDeptId
(
dept
.
getDeptId
(
));
req
.
setDeptId
(
Long
.
parseLong
(
dept
.
getCode
()
));
req
.
setCursor
(
0L
);
req
.
setSize
(
100L
);
req
.
setOrderField
(
"modify_desc"
);
...
...
@@ -66,12 +68,14 @@ public class DingtalkUsersService extends AbstractSynchronizerService implement
_logger
.
info
(
"name : "
+
user
.
getName
()+
" , "
+
user
.
getLoginId
()+
" , "
+
user
.
getUserid
());
UserInfo
userInfo
=
buildUserInfo
(
user
);
_logger
.
info
(
"userInfo "
+
userInfo
);
//if(userInfoService.findByUsername(userInfo.getUsername()) == null) {
if
(
userInfoService
.
findOne
(
"username = ? and instid = ?"
,
new
Object
[]
{
userInfo
.
getUsername
(),
this
.
getSynchronizer
().
getInstId
()
},
new
int
[]
{
Types
.
VARCHAR
,
Types
.
VARCHAR
})
==
null
)
{
userInfo
.
setPassword
(
userInfo
.
getUsername
()
+
"Maxkey@888"
);
this
.
userInfoService
.
insert
(
userInfo
);
//
}else {
//
userInfoService.update(userInfo);
//
}
}
else
{
userInfoService
.
update
(
userInfo
);
}
}
}
...
...
@@ -91,21 +95,24 @@ public class DingtalkUsersService extends AbstractSynchronizerService implement
public
UserInfo
buildUserInfo
(
ListUserResponse
user
)
{
UserInfo
userInfo
=
new
UserInfo
();
userInfo
.
setUsername
(
user
.
getUserid
());
//
鐧诲綍鍚
�
userInfo
.
setNickName
(
user
.
getName
());
//
鐢ㄦ埛鍚
�
userInfo
.
setDisplayName
(
user
.
getName
());
//
鐢ㄦ埛鍚
�
userInfo
.
setFormattedName
(
user
.
getName
());
//
鐢ㄦ埛鍚
�
userInfo
.
setUsername
(
user
.
getUserid
());
//
閻ц缍嶉崥锟
�
userInfo
.
setNickName
(
user
.
getName
());
//
閻€劍鍩涢崥锟
�
userInfo
.
setDisplayName
(
user
.
getName
());
//
閻€劍鍩涢崥锟
�
userInfo
.
setFormattedName
(
user
.
getName
());
//
閻€劍鍩涢崥锟
�
userInfo
.
setEmail
(
StringUtils
.
isBlank
(
user
.
getEmail
())?
user
.
getUserid
()
+
"@maxkey.top"
:
user
.
getEmail
());
userInfo
.
setEntryDate
(
new
DateTime
(
user
.
getHiredDate
()).
toString
(
DateTimeFormat
.
forPattern
(
"yyyy-MM-dd"
)));
userInfo
.
setMobile
(
user
.
getMobile
());
//鎵嬫満
userInfo
.
setMobile
(
user
.
getMobile
());
//閹靛婧�
userInfo
.
setDepartmentId
(
user
.
getDeptIdList
().
get
(
0
)+
""
);
userInfo
.
setJobTitle
(
user
.
getTitle
());
//鑱屽姟
userInfo
.
setWorkEmail
(
user
.
getOrgEmail
());
//宸ヤ綔閭欢
userInfo
.
setWorkPhoneNumber
(
user
.
getTelephone
());
//鍏徃鐢佃瘽
userInfo
.
setWorkOfficeName
(
user
.
getWorkPlace
());
//鍔炲叕瀹�
userInfo
.
setDescription
(
user
.
getRemark
());
//澶囨敞
userInfo
.
setEmployeeNumber
(
user
.
getJobNumber
());
userInfo
.
setJobTitle
(
user
.
getTitle
());
//閼卞苯濮�
userInfo
.
setWorkEmail
(
user
.
getOrgEmail
());
//瀹搞儰缍旈柇顔绘
userInfo
.
setWorkPhoneNumber
(
user
.
getTelephone
());
//閸忣剙寰冮悽浣冪樈
userInfo
.
setWorkOfficeName
(
user
.
getWorkPlace
());
//閸旂偛鍙曠�癸拷
userInfo
.
setInstId
(
this
.
synchronizer
.
getInstId
());
userInfo
.
setDescription
(
"dingtalk "
+
user
.
getRemark
());
return
userInfo
;
}
...
...
@@ -115,9 +122,4 @@ public class DingtalkUsersService extends AbstractSynchronizerService implement
this
.
access_token
=
access_token
;
}
public
void
setDingdingOrganizationService
(
DingtalkOrganizationService
dingdingOrganizationService
)
{
this
.
dingdingOrganizationService
=
dingdingOrganizationService
;
}
}
maxkey-identitys/maxkey-synchronizers-workweixin/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java
浏览文件 @
89ca99e1
...
...
@@ -17,6 +17,9 @@
package
org.maxkey.synchronizer.workweixin
;
import
java.sql.Types
;
import
org.maxkey.constants.ConstsStatus
;
import
org.maxkey.entity.Organizations
;
import
org.maxkey.synchronizer.AbstractSynchronizerService
;
import
org.maxkey.synchronizer.ISynchronizerService
;
...
...
@@ -47,7 +50,13 @@ public class WorkweixinOrganizationService extends AbstractSynchronizerService i
for
(
WorkWeixinDepts
dept
:
rsp
.
getDepartment
())
{
_logger
.
info
(
"dept : "
+
dept
.
getId
()+
" "
+
dept
.
getName
()+
" "
+
dept
.
getParentid
());
Organizations
org
=
buildOrganization
(
dept
);
this
.
organizationsService
.
merge
(
org
);
if
(
organizationsService
.
findOne
(
"id = ? and instid = ?"
,
new
Object
[]
{
org
.
getId
().
toString
(),
org
.
getInstId
()
},
new
int
[]
{
Types
.
VARCHAR
,
Types
.
VARCHAR
})
==
null
)
{
organizationsService
.
insert
(
org
);
}
else
{
organizationsService
.
update
(
org
);
}
}
}
catch
(
Exception
e
)
{
...
...
@@ -75,6 +84,8 @@ public class WorkweixinOrganizationService extends AbstractSynchronizerService i
org
.
setParentId
(
dept
.
getParentid
()+
""
);
org
.
setSortIndex
(
dept
.
getOrder
());
org
.
setInstId
(
this
.
synchronizer
.
getInstId
());
org
.
setStatus
(
ConstsStatus
.
ACTIVE
);
org
.
setDescription
(
"WorkWeixin"
);
return
org
;
}
...
...
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/AbstractSynchronizerService.java
浏览文件 @
89ca99e1
...
...
@@ -56,7 +56,7 @@ public abstract class AbstractSynchronizerService {
}
for
(
Organizations
org
:
orgsList
)
{
if
(
org
.
getId
().
equals
(
orgId
)
&&
orgId
.
equals
(
"1"
))
{
if
(
org
.
getId
().
equals
(
orgId
)
&&
orgId
.
equals
(
"1"
))
{
rootOrganization
=
org
;
rootOrganization
.
setNamePath
(
"/"
+
rootOrganization
.
getName
());
rootOrganization
.
setCodePath
(
"/1"
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录