This commit is contained in:
MaxKey 2022-02-26 19:40:57 +08:00
parent d88dc90b6f
commit 61673b4b07
11 changed files with 201 additions and 102 deletions

View File

@ -28,7 +28,7 @@ public class InMemoryRemeberMeService extends AbstractRemeberMeService {
protected static final Cache<String, RemeberMe> remeberMeStore =
Caffeine.newBuilder()
.expireAfterWrite(ConstsTimeInterval.TWO_WEEK, TimeUnit.MINUTES)
.expireAfterWrite(ConstsTimeInterval.TWO_WEEK, TimeUnit.SECONDS)
.build();
@Override

View File

@ -31,7 +31,8 @@ public class HttpsTrusts {
sc.init(null, trustAllCerts, null);
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
/*
/**
* https ssl auto trust
*/
public static void beforeConnection() {

View File

@ -20,7 +20,6 @@ package org.maxkey.util;
import java.util.Locale;
import java.util.regex.Pattern;
import org.maxkey.client.oauth.model.OAuthConstants;
/**
* Utils for checking preconditions and invariants
@ -32,6 +31,8 @@ public abstract class Preconditions {
// scheme = alpha *( alpha | digit | "+" | "-" | "." )
private static final String URL_REGEXP = "^[a-zA-Z][a-zA-Z0-9+.-]*://\\S+";
private static final String OUT_OF_BAND = "oob";
/**
* Checks that an object is not null.
*
@ -75,7 +76,7 @@ public abstract class Preconditions {
*/
public static void checkValidOAuthCallback(String url, String errorMsg) {
checkEmptyString(url, errorMsg);
if (url.toLowerCase(Locale.getDefault()).compareToIgnoreCase(OAuthConstants.OUT_OF_BAND) != 0) {
if (url.toLowerCase(Locale.getDefault()).compareToIgnoreCase(OUT_OF_BAND) != 0) {
check(isUrl(url), errorMsg);
}
}

View File

@ -20,7 +20,8 @@ package org.maxkey.util;
import java.security.Provider;
import java.security.Security;
import org.maxkey.client.crypto.ReciprocalUtils;
import org.maxkey.crypto.password.PasswordReciprocal;
public class InstanceTest {
@ -28,9 +29,9 @@ public class InstanceTest {
if(System.getProperty("java.version").startsWith("1.8")) {
System.out.println("1.8");
Security.addProvider((Provider)Instance.newInstance("com.sun.crypto.provider.SunJCE"));
System.out.println(ReciprocalUtils.encode("ddddd"));
System.out.println(PasswordReciprocal.getInstance().encode("ddddd"));
System.out.println(ReciprocalUtils.encode("ddfs"));
System.out.println(PasswordReciprocal.getInstance().encode("ddfs"));
}else {
System.out.println("other");
}

View File

@ -49,4 +49,10 @@ public final class ConstsStatus {
public static final int QUITED = 15;
public static final String NONE = "NONE";
public static final String YES = "YES";
public static final String NO = "NO";
}

View File

@ -121,7 +121,13 @@ public class ActiveDirectoryUser {
public static final String NAME = "name";
public static final String UID = "uid";
/**
* First Name
*/
public static final String GIVENNAME = "givenName";
/**
* Last Name/SurName
*/
public static final String SN = "sn";
public static final String INITIALS = "initials";
public static final String DESCRIPTION = "description";
@ -143,8 +149,13 @@ public class ActiveDirectoryUser {
public static final String INFO = "info";
public static final String HOMEPHONE = "homePhone";
/**
* admin@maxkey.top
*/
public static final String USERPRINCIPALNAME = "userPrincipalName";
/**
* maxkey\admin
*/
public static final String SAMACCOUNTNAME = "sAMAccountname";
public static final String LOGONHOURS = "logonHours";
public static final String LOGONWORKSTATION = "logonWorkstation";

View File

@ -19,7 +19,6 @@ package org.maxkey.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@ -271,80 +270,80 @@ public class UserInfo extends JpaBaseEntity {
public static class ONLINE {
// 在线
public static final int ONLINE = 1;
public static final int ONLINE = 1;
// 下线
public static final int OFFLINE = 0;
public static final int OFFLINE = 0;
}
public static class MARRIED {
// 未知
public static final int UNKNOWN = 0;
public static final int UNKNOWN = 0;
// 单身
public static final int SINGLE = 1;
public static final int SINGLE = 1;
// 结婚
public static final int MARRIED = 2;
public static final int MARRIED = 2;
// 离异
public static final int DIVORCE = 3;
public static final int DIVORCE = 3;
// 丧偶
public static final int WIDOWED = 4;
public static final int WIDOWED = 4;
}
public static class GENDER {
// 未知
public static final int UNKNOWN = 0;
public static final int UNKNOWN = 0;
// 女性
public static final int FEMALE = 1;
public static final int FEMALE = 1;
// 男性
public static final int MALE = 2;
public static final int MALE = 2;
}
public static class IDTYPE {
// 未知
public static final int UNKNOWN = 0;
public static final int UNKNOWN = 0;
// 身份证
public static final int IDCARD = 1;
public static final int IDCARD = 1;
// 护照
public static final int PASSPORT = 2;
public static final int PASSPORT = 2;
// 学生证
public static final int STUDENTCARD = 3;
public static final int STUDENTCARD = 3;
// 军人证
public static final int MILITARYCARD = 4;
public static final int MILITARYCARD = 4;
}
public static class AUTHNTYPE {
// 用户名密码
public static final int NORMAL = 1;
public static final int NORMAL = 1;
// 手机
public static final int MOBILE = 2;
public static final int MOBILE = 2;
// 短信
public static final int SMS = 3;
public static final int SMS = 3;
// 邮箱
public static final int EMAIL = 4;
public static final int EMAIL = 4;
public static final int TIMEBASED_OPT = 5;
public static final int TIMEBASED_OPT = 5;
public static final int COUNTERBASED_OPT = 6;
public static final int COUNTERBASED_OPT = 6;
public static final int HOTP_OPT = 7;
public static final int HOTP_OPT = 7;
public static final int RSA_OPT = 8;
public static final int RSA_OPT = 8;
// 证书
public static final int CERTIFICATE = 9;
public static final int CERTIFICATE = 9;
// usb证书
public static final int USBKEY = 10;
public static final int USBKEY = 10;
}
public static class EMPLOYMENTSTATUS {
// 在册人员
public static final int ACTIVE = 1;
public static final int ACTIVE = 1;
// 离职人员
public static final int WITHDRAWN = 2;
public static final int WITHDRAWN = 2;
// 停薪留职人员
public static final int INACTIVE = 3;
public static final int INACTIVE = 3;
// 退休人员
public static final int RETIREE = 4;
public static final int RETIREE = 4;
}
@ -1324,10 +1323,6 @@ public class UserInfo extends JpaBaseEntity {
builder.append(gender);
builder.append(", birthDate=");
builder.append(birthDate);
builder.append(", picture=");
builder.append(Arrays.toString(picture));
builder.append(", pictureFile=");
builder.append(pictureFile);
builder.append(", idType=");
builder.append(idType);
builder.append(", idCardNo=");

View File

@ -20,14 +20,13 @@ package org.maxkey.authz.exapi.endpoint.adapter;
import java.time.Instant;
import java.util.HashMap;
import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter;
import org.maxkey.client.http.HttpVerb;
import org.maxkey.client.oauth.OAuthClient;
import org.maxkey.crypto.DigestUtils;
import org.maxkey.entity.Accounts;
import org.maxkey.entity.ExtraAttrs;
import org.maxkey.entity.apps.Apps;
import org.maxkey.util.HttpsTrusts;
import org.maxkey.util.JsonUtils;
import org.maxkey.web.HttpRequestAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
@ -88,7 +87,7 @@ public class ExtendApiCndnsApiMailAdapter extends AbstractAuthorizeAdapter {
String timestamp = ""+Instant.now().getEpochSecond();
String tokenMd5 =DigestUtils.md5Hex(details.getCredentials());
HashMap<String,String > requestParamenter =new HashMap<String,String >();
HashMap<String,Object > requestParamenter =new HashMap<String,Object >();
String redirect_uri = "";
if(action.equalsIgnoreCase("getDomailUrl")) {
String sign =DigestUtils.md5Hex
@ -96,12 +95,11 @@ public class ExtendApiCndnsApiMailAdapter extends AbstractAuthorizeAdapter {
SIGN_STRING,
details.getPrincipal(),timestamp,tokenMd5));
requestParamenter.put("domain", domain);
OAuthClient authkeyRestClient=new OAuthClient(
String.format(ADMIN_AUTHKEY_URI,details.getPrincipal(),sign,timestamp),HttpVerb.POST);
authkeyRestClient.addRestObject(requestParamenter);
String responseBody = new HttpRequestAdapter().post(
String.format(ADMIN_AUTHKEY_URI,details.getPrincipal(),sign,timestamp),requestParamenter);
HashMap<String, String> authKey=JsonUtils.gson2Object(authkeyRestClient.execute().getBody(), HashMap.class);
redirect_uri=authKey.get("adminUrl");
HashMap<String, String> authKey=JsonUtils.gson2Object(responseBody, HashMap.class);
redirect_uri = authKey.get("adminUrl");
}else {
String sign =DigestUtils.md5Hex
@ -109,11 +107,10 @@ public class ExtendApiCndnsApiMailAdapter extends AbstractAuthorizeAdapter {
SIGN_EMAIL_STRING,
details.getPrincipal(),userInfo.getEmail(),timestamp,tokenMd5));
requestParamenter.put("email", userInfo.getWorkEmail());
OAuthClient authkeyRestClient=new OAuthClient(
String.format(AUTHKEY_URI,details.getPrincipal(),sign,timestamp),HttpVerb.POST);
authkeyRestClient.addRestObject(requestParamenter);
String responseBody = new HttpRequestAdapter().post(
String.format(AUTHKEY_URI,details.getPrincipal(),sign,timestamp),requestParamenter);
HashMap<String, String> authKey=JsonUtils.gson2Object(authkeyRestClient.execute().getBody(), HashMap.class);
HashMap<String, String> authKey=JsonUtils.gson2Object(responseBody, HashMap.class);
redirect_uri=authKey.get("webmailUrl");
}

View File

@ -17,15 +17,15 @@
package org.maxkey.authz.exapi.endpoint.adapter;
import java.util.HashMap;
import java.io.Serializable;
import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter;
import org.maxkey.client.oauth.OAuthClient;
import org.maxkey.client.oauth.model.Token;
import org.maxkey.entity.Accounts;
import org.maxkey.entity.ExtraAttrs;
import org.maxkey.entity.apps.Apps;
import org.maxkey.util.HttpsTrusts;
import org.maxkey.util.JsonUtils;
import org.maxkey.web.HttpRequestAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
@ -38,9 +38,9 @@ import org.springframework.web.servlet.ModelAndView;
public class ExtendApiQQExmailAdapter extends AbstractAuthorizeAdapter {
final static Logger _logger = LoggerFactory.getLogger(ExtendApiQQExmailAdapter.class);
//https://exmail.qq.com/qy_mng_logic/doc#10003
static String TOKEN_URI="https://api.exmail.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
static String TOKEN_URI = "https://api.exmail.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
//https://exmail.qq.com/qy_mng_logic/doc#10036
static String AUTHKEY_URI="https://api.exmail.qq.com/cgi-bin/service/get_login_url?access_token=%s&userid=%s";
static String AUTHKEY_URI = "https://api.exmail.qq.com/cgi-bin/service/get_login_url?access_token=%s&userid=%s";
Accounts account;
@ -49,8 +49,6 @@ public class ExtendApiQQExmailAdapter extends AbstractAuthorizeAdapter {
return null;
}
@SuppressWarnings("unchecked")
@Override
public ModelAndView authorize(ModelAndView modelAndView) {
HttpsTrusts.beforeConnection();
@ -62,23 +60,111 @@ public class ExtendApiQQExmailAdapter extends AbstractAuthorizeAdapter {
extraAttrs=new ExtraAttrs(details.getExtendAttr());
}
_logger.debug("Extra Attrs "+extraAttrs);
OAuthClient tokenRestClient=new OAuthClient(
String.format(TOKEN_URI,details.getPrincipal(),details.getCredentials()));
Token token =tokenRestClient.requestAccessToken();
_logger.debug(""+token);
String responseBody = new HttpRequestAdapter().get(
String.format(TOKEN_URI,details.getPrincipal(),details.getCredentials()),null);
Token token =JsonUtils.gson2Object(responseBody,Token.class);
_logger.debug("token {}" , token);
OAuthClient authkeyRestClient=new OAuthClient(
String.format(AUTHKEY_URI,token.getAccess_token(),userInfo.getUsername()));
String authKeyBody = new HttpRequestAdapter().get(
String.format(AUTHKEY_URI,token.getAccess_token(),userInfo.getUsername()),null);
HashMap<String, String> authKey=JsonUtils.gson2Object(authkeyRestClient.execute().getBody(), HashMap.class);
_logger.debug("authKey : "+authKey);
LoginUrl loginUrl=JsonUtils.gson2Object(authKeyBody, LoginUrl.class);
_logger.debug("LoginUrl {} " , loginUrl);
String redirect_uri=authKey.get("login_url");
_logger.debug("redirect_uri : "+redirect_uri);
modelAndView.addObject("redirect_uri", redirect_uri);
modelAndView.addObject("redirect_uri", loginUrl.getLogin_url());
return modelAndView;
}
class ExMailMsg{
protected long expires_in;
protected String errmsg;
protected long errcode;
public ExMailMsg() {
}
public long getExpires_in() {
return expires_in;
}
public void setExpires_in(long expires_in) {
this.expires_in = expires_in;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
public long getErrcode() {
return errcode;
}
public void setErrcode(long errcode) {
this.errcode = errcode;
}
}
class Token extends ExMailMsg implements Serializable {
private static final long serialVersionUID = 275756585220635542L;
/**
* access_token
*/
private String access_token;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Token [access_token=");
builder.append(access_token);
builder.append("]");
return builder.toString();
}
}
class LoginUrl extends ExMailMsg implements Serializable {
private static final long serialVersionUID = 3033047757268214198L;
private String login_url;
public String getLogin_url() {
return login_url;
}
public void setLogin_url(String login_url) {
this.login_url = login_url;
}
public LoginUrl() {
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("LoginUrl [login_url=");
builder.append(login_url);
builder.append("]");
return builder.toString();
}
}
}

View File

@ -117,43 +117,44 @@ public class ActiveDirectoryUsersService extends AbstractSynchronizerService
userInfo.setDepartmentId(deptOrg.getId());
try {
userInfo.setId(userInfo.generateId());
userInfo.setFormattedName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.CN,attributeMap));//閸忋劌鎮<EFBFBD>
//鐠愶附鍩<EFBFBD>
userInfo.setUsername(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.SAMACCOUNTNAME,attributeMap));//鐠愶箑褰<EFBFBD>
userInfo.setWindowsAccount(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.USERPRINCIPALNAME,attributeMap));//閻ц<EFBFBD>
userInfo.setFormattedName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.CN,attributeMap));//cn
//
userInfo.setUsername(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.SAMACCOUNTNAME,attributeMap));//WindowsAccount
userInfo.setWindowsAccount(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.SAMACCOUNTNAME,attributeMap));
//userInfo.setWindowsAccount(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.USERPRINCIPALNAME,attributeMap));//
//瓕顫<EFBFBD>
userInfo.setFamilyName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.SN,attributeMap));//
userInfo.setGivenName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.GIVENNAME,attributeMap));//閸氾拷
userInfo.setNickName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.INITIALS,attributeMap));//閺勭數袨
userInfo.setNameZhShortSpell(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.INITIALS,attributeMap));//閼昏鲸鏋冪紓鈺佸晸
userInfo.setDisplayName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DISPLAYNAME,attributeMap));//閺勫墽銇氶崥宥囆<EFBFBD>
userInfo.setDescription(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DESCRIPTION,attributeMap));//閹诲繗鍫<EFBFBD>
userInfo.setWorkPhoneNumber(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.TELEPHONENUMBER,attributeMap));//絻鐦介崣椋庣垳
userInfo.setWorkOfficeName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.PHYSICALDELIVERYOFFICENAME,attributeMap));//閸旂偛鍙曠<EFBFBD>癸拷
userInfo.setWorkEmail(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.MAIL,attributeMap));//喕娆<EFBFBD>
userInfo.setWebSite(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.WWWHOMEPAGE,attributeMap));//缂冩垿銆<EFBFBD>
//澘娼<EFBFBD>
userInfo.setWorkCountry(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.CO,attributeMap));//閸ヨ棄顔<EFBFBD>
userInfo.setWorkRegion(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.ST,attributeMap));//
userInfo.setWorkLocality(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.L,attributeMap));//閸橈拷
userInfo.setWorkStreetAddress(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.STREETADDRESS,attributeMap));//鐞涙<EFBFBD>
userInfo.setWorkPostalCode(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.POSTALCODE,attributeMap));//喚绱<EFBFBD>
userInfo.setWorkAddressFormatted(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.POSTOFFICEBOX,attributeMap));//喗鏂傞柇顔绢唸
//
userInfo.setFamilyName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.SN,attributeMap));//Last Name/SurName
userInfo.setGivenName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.GIVENNAME,attributeMap));//First Name
userInfo.setNickName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.INITIALS,attributeMap));//Initials
userInfo.setNameZhShortSpell(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.INITIALS,attributeMap));//Initials
userInfo.setDisplayName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DISPLAYNAME,attributeMap));//
userInfo.setDescription(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DESCRIPTION,attributeMap));//
userInfo.setWorkPhoneNumber(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.TELEPHONENUMBER,attributeMap));//
userInfo.setWorkOfficeName(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.PHYSICALDELIVERYOFFICENAME,attributeMap));//
userInfo.setWorkEmail(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.MAIL,attributeMap));//
userInfo.setWebSite(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.WWWHOMEPAGE,attributeMap));//
//
userInfo.setWorkCountry(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.CO,attributeMap));//
userInfo.setWorkRegion(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.ST,attributeMap));//
userInfo.setWorkLocality(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.L,attributeMap));//
userInfo.setWorkStreetAddress(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.STREETADDRESS,attributeMap));//
userInfo.setWorkPostalCode(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.POSTALCODE,attributeMap));//
userInfo.setWorkAddressFormatted(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.POSTOFFICEBOX,attributeMap));//
if(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.MOBILE,attributeMap).equals("")) {
userInfo.setMobile(userInfo.getId());
}else {
userInfo.setMobile(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.MOBILE,attributeMap));//閹靛<EFBFBD>
userInfo.setMobile(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.MOBILE,attributeMap));//
}
userInfo.setHomePhoneNumber(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.HOMEPHONE,attributeMap));//鐎硅泛娑甸悽浣冪樈
userInfo.setWorkFax(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.FACSIMILETELEPHONENUMBER,attributeMap));//娴肩姷婀<EFBFBD>
userInfo.setHomeAddressFormatted(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.INFO,attributeMap));//絻鐦芥径鍥ㄦ暈
userInfo.setHomePhoneNumber(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.HOMEPHONE,attributeMap));//
userInfo.setWorkFax(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.FACSIMILETELEPHONENUMBER,attributeMap));//
userInfo.setHomeAddressFormatted(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.INFO,attributeMap));//
userInfo.setDivision(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.COMPANY,attributeMap)); //閸忣剙寰<EFBFBD>
//userInfo.setDepartment(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DEPARTMENT,attributeMap)); //劑妫<EFBFBD>
//userInfo.setDepartmentId(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DEPARTMENT,attributeMap)); //劑妫紓鏍у娇
userInfo.setJobTitle(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.TITLE,attributeMap));//閼卞苯濮<EFBFBD>
userInfo.setDivision(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.COMPANY,attributeMap)); //
//userInfo.setDepartment(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DEPARTMENT,attributeMap)); //
//userInfo.setDepartmentId(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.DEPARTMENT,attributeMap)); //
userInfo.setJobTitle(LdapUtils.getAttributeStringValue(ActiveDirectoryUser.TITLE,attributeMap));//
userInfo.setUserState("RESIDENT");
userInfo.setUserType("EMPLOYEE");
userInfo.setTimeZone("Asia/Shanghai");