From 89ca99e153e81acafe5b2784e8319d072bc56ebb Mon Sep 17 00:00:00 2001 From: MaxKey Date: Sat, 22 Jan 2022 17:53:32 +0800 Subject: [PATCH] dingtalk --- .../org/maxkey/authn/LoginCredential.java | 64 ++++++++++++++----- .../org/maxkey/entity/OrganizationsCast.java | 6 ++ .../dingtalk/DingtalkOrganizationService.java | 61 ++++++++++++------ .../dingtalk/DingtalkUsersService.java | 58 +++++++++-------- .../WorkweixinOrganizationService.java | 13 +++- .../AbstractSynchronizerService.java | 2 +- 6 files changed, 137 insertions(+), 67 deletions(-) diff --git a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/LoginCredential.java b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/LoginCredential.java index d4c2e777..59814426 100644 --- a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/LoginCredential.java +++ b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/LoginCredential.java @@ -42,6 +42,8 @@ public class LoginCredential implements Authentication { String provider; String code; String message = WebConstants.LOGIN_RESULT.SUCCESS; + String instId; + ArrayList 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(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/entity/OrganizationsCast.java b/maxkey-core/src/main/java/org/maxkey/entity/OrganizationsCast.java index 0d8cda7e..d1775ddc 100644 --- a/maxkey-core/src/main/java/org/maxkey/entity/OrganizationsCast.java +++ b/maxkey-core/src/main/java/org/maxkey/entity/OrganizationsCast.java @@ -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; diff --git a/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkOrganizationService.java b/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkOrganizationService.java index a0bfceb9..b4a9ffce 100644 --- a/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkOrganizationService.java +++ b/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkOrganizationService.java @@ -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 deptsQueue = new LinkedBlockingQueue(); + deptsQueue.add(1L); + HashMap deptMap = new HashMap(); + 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; - } - } diff --git a/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkUsersService.java b/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkUsersService.java index 159cb65e..ade400cb 100644 --- a/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkUsersService.java +++ b/maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkUsersService.java @@ -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 = + 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; - } - - } diff --git a/maxkey-identitys/maxkey-synchronizers-workweixin/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java b/maxkey-identitys/maxkey-synchronizers-workweixin/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java index 87b42072..d64d7cfe 100644 --- a/maxkey-identitys/maxkey-synchronizers-workweixin/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java +++ b/maxkey-identitys/maxkey-synchronizers-workweixin/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java @@ -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; } diff --git a/maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/AbstractSynchronizerService.java b/maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/AbstractSynchronizerService.java index 049fa0fb..eec10746 100644 --- a/maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/AbstractSynchronizerService.java +++ b/maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/AbstractSynchronizerService.java @@ -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"); -- GitLab