提交 4c053595 编写于 作者: sq3536's avatar sq3536

钉钉用户登录改造

上级 5351b87b
......@@ -40,6 +40,7 @@ import java.io.IOException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.sql.Wrapper;
import java.util.Date;
......@@ -59,62 +60,9 @@ public class UserDingtalkRegisterService {
@Autowired
private ISysUserAuthService sysUserAuthService;
/**
* 注册
*
* @param ibzuser
*/
public void toRegister(IBZUSER ibzuser) {
// 创建ibzuser
boolean flag = ibzuserService.save(ibzuser);
if (!flag) {
throw new BadRequestAlertException("注册失败","UserDingtalkRegisterService","");
}
}
/**
* 创建钉钉用户授权信息
* @param userAuth
*/
public void toCreateUserAuth(SysUserAuth userAuth) {
// 创建用户授权信息
boolean flag = sysUserAuthService.create(userAuth);
if (!flag) {
throw new BadRequestAlertException("保存用户授权信息失败", "UserDingtalkRegisterService", "");
}
}
/**
* 钉钉服务端通过临时授权码code获取授权用户的个人信息
*
* @param code
* @param currentTimeMillis
* @param appId
* @param appSecret
* @return
*/
public JSONObject requestDingtalkUserByCode(String code, long currentTimeMillis, String appId, String appSecret) {
JSONObject returnObj = null;
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
req.setTmpAuthCode(code);
try {
OapiSnsGetuserinfoBycodeResponse response = client.execute(req,appId,appSecret);
if(response.getErrcode()!=0)
{
throw new BadRequestAlertException(response.getErrmsg(), "UserDingtalkRegisterService", "");
}
returnObj = (JSONObject)JSONObject.toJSON(response.getUserInfo());
} catch (ApiException e) {
e.printStackTrace();
throw new InternalServerErrorException("获取access_token失败");
}
return returnObj;
}
private long lastRefreshTime=System.currentTimeMillis()-7200001;
private String accessToken="";
public boolean isExpire()
......@@ -165,6 +113,7 @@ public class UserDingtalkRegisterService {
if(!accessToken.equals(sysOpenAccess.getAccessToken()))
{
sysOpenAccess.setAccessToken(accessToken);
sysOpenAccess.setExpiresTime(new Timestamp(lastRefreshTime));
sysOpenAccessService.update(sysOpenAccess);
}
......@@ -175,14 +124,17 @@ public class UserDingtalkRegisterService {
public AuthenticationUser getUserByToken(String id,String requestAuthCode)
{
final String accessid = StringUtils.isEmpty(id)?"dingtalk":id;
SysOpenAccess openAccess = getOpenAccess(id);
if (openAccess==null || (openAccess.getDisabled()!=null && openAccess.getDisabled()==1))
throw new BadRequestAlertException("未找到配置", "UserDingtalkRegisterService", "");
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
request.setCode(requestAuthCode);
request.setHttpMethod("GET");
OapiUserGetuserinfoResponse response = null;
try {
response = client.execute(request, accessToken);
response = client.execute(request, openAccess.getAccessToken());
if(response.getErrcode()!=0||StringUtils.isEmpty(response.getUserid()))
throw new BadRequestAlertException("获取user失败","UserDingtalkRegisterService",response.getErrmsg());
} catch (ApiException e) {
......@@ -212,4 +164,55 @@ public class UserDingtalkRegisterService {
return null;
}
/**
* 钉钉服务端通过临时授权码code获取授权用户的个人信息
*
* @return
*/
public JSONObject getUserBySnsToken(String id,String requestAuthCode) {
JSONObject returnObj = null;
SysOpenAccess openAccess = getOpenAccess(id);
if (openAccess==null || (openAccess.getDisabled()!=null && openAccess.getDisabled()==1))
throw new BadRequestAlertException("未找到配置", "UserDingtalkRegisterService", "");
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
req.setTmpAuthCode(requestAuthCode);
try {
OapiSnsGetuserinfoBycodeResponse response = client.execute(req,openAccess.getAccessKey(),openAccess.getSecretKey());
if(response.getErrcode()!=0)
{
throw new BadRequestAlertException("获取user失败", "UserDingtalkRegisterService", response.getErrmsg());
}
returnObj.put("openid", response.getUserInfo().getOpenid());
returnObj.put("nickname", response.getUserInfo().getNick());
SysUserAuth userAuth = sysUserAuthService.getOne(Wrappers.<SysUserAuth>lambdaQuery().eq(SysUserAuth::getIdentityType,"dingtalk").eq(SysUserAuth::getIdentifier, response.getUserInfo().getOpenid()),false);
IBZUSER user = null;
// 该钉钉用户注册过账号,登录系统
if (userAuth!=null) {
user = ibzuserService.getById(userAuth.getUserid());
if (user == null)
user = ibzuserService.getOne(Wrappers.<IBZUSER>lambdaQuery().eq(IBZUSER::getUserid,response.getUserInfo().getOpenid()).or().eq(IBZUSER::getUsername,response.getUserInfo().getOpenid()),false);
if(user!=null)
{
returnObj.put("username",user.getLoginname()+(StringUtils.isEmpty(user.getDomains())?"":("|"+user.getDomains())));
}
}
} catch (ApiException e) {
e.printStackTrace();
throw new InternalServerErrorException("获取user失败");
}
return returnObj;
}
}
\ No newline at end of file
package cn.ibizlab.core.uaa.extensions.service;
import cn.ibizlab.core.uaa.domain.SysUserAuth;
import cn.ibizlab.core.uaa.service.ISysUserAuthService;
import cn.ibizlab.util.domain.IBZUSER;
import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.util.helper.CachedBeanCopier;
import cn.ibizlab.util.service.IBZUSERService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import java.sql.Wrapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* 实体[IBZUSER] 用户注册接口实现
......@@ -16,20 +31,84 @@ public class UserRegisterService {
@Autowired
private IBZUSERService ibzuserService;
@Autowired
private ISysUserAuthService sysUserAuthService;
@Value("${ibiz.auth.pwencrymode:0}")
private int pwencrymode;
public IBZUSER toRegister(IBZUSER account)
{
return toRegister(account,null);
}
public IBZUSER toRegister(IBZUSER account, SysUserAuth sysUserAuth) {
String domains = account.getDomains();
String loginname = account.getLoginname();
String personname = account.getPersonname();
String password = account.getPassword();
String phone = account.getPhone();
String email = account.getEmail();
if (StringUtils.isEmpty(loginname))
throw new BadRequestAlertException("用户名为空", "UserRegisterResource", "");
if (StringUtils.isEmpty(password))
throw new BadRequestAlertException("密码为空", "UserRegisterResource", "");
if(sysUserAuth!=null)
{
if(StringUtils.isEmpty(sysUserAuth.getIdentityType()))
throw new BadRequestAlertException("第三方平台类型为空", "UserRegisterResource", "");
if(StringUtils.isEmpty(sysUserAuth.getIdentifier()))
throw new BadRequestAlertException("第三方平台用户标识为空", "UserRegisterResource", "");
}
else if(StringUtils.isEmpty(personname))
throw new BadRequestAlertException("用户名称为空", "UserRegisterResource", "");
String username = loginname+(StringUtils.isEmpty(domains)?"":("|"+domains));
IBZUSER existedUser = ibzuserService.getOne(Wrappers.<IBZUSER>lambdaQuery().eq(IBZUSER::getLoginname,loginname)
.eq((!StringUtils.isEmpty(domains)),IBZUSER::getDomains,domains),false);
if(existedUser!=null)
{
if(sysUserAuth==null)
throw new BadRequestAlertException("该用户名"+(StringUtils.isEmpty(phone)?"":"或手机号")+"已被注册", "UserRegisterResource", "");
else
{
if(pwencrymode==1)
password = DigestUtils.md5DigestAsHex(password.getBytes());
else if(pwencrymode==2)
password = DigestUtils.md5DigestAsHex(String.format("%1$s||%2$s", username, password).getBytes());
if(!password.equals(existedUser.getPassword()))
throw new BadRequestAlertException("绑定到已有账号失败,请输入正确的密码", "UserRegisterResource", "");
account.setPassword(password);
account.setUserid(existedUser.getUserid());
account.setUserid(username);
}
}
else
{
account.setUsername(username);
if(pwencrymode==1)
password = DigestUtils.md5DigestAsHex(password.getBytes());
else if(pwencrymode==2)
password = DigestUtils.md5DigestAsHex(String.format("%1$s||%2$s", username, password).getBytes());
account.setPassword(password);
account.setUserid(username);
ibzuserService.save(account);
}
/**
* 注册
*
* @param ibzuser
* @return
*/
public IBZUSER toRegister(IBZUSER ibzuser) {
// 创建ibzuser
boolean flag = ibzuserService.save(ibzuser);
if (!flag) {
return null;
if(sysUserAuth!=null)
{
sysUserAuth.setUserid(account.getUserid());
sysUserAuthService.save(sysUserAuth);
}
return ibzuser;
return account;
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package cn.ibizlab.api.rest.extensions;
import cn.ibizlab.core.uaa.domain.SysOpenAccess;
import cn.ibizlab.core.uaa.domain.SysUserAuth;
import cn.ibizlab.core.uaa.extensions.service.UserDingtalkRegisterService;
import cn.ibizlab.core.uaa.extensions.service.UserRegisterService;
import cn.ibizlab.core.uaa.service.ISysOpenAccessService;
import cn.ibizlab.core.uaa.service.ISysUserAuthService;
import cn.ibizlab.util.domain.IBZUSER;
......@@ -30,6 +31,8 @@ public class UserDingtalkRegisterResource {
@Autowired
private UserDingtalkRegisterService userDingtalkRegisterService;
@Autowired
private UserRegisterService userRegisterService;
@Autowired
private IBZUSERService ibzuserService;
@Autowired
private ISysUserAuthService sysUserAuthService;
......@@ -54,6 +57,8 @@ public class UserDingtalkRegisterResource {
if (!StringUtils.isEmpty(appId)) {
obj.put("appid", appId);
obj.put("access_token",openAccess.getAccessToken());
obj.put("corp_id",openAccess.getRegionId());
obj.put("redirect_uri",openAccess.getRedirectUri());
}
return ResponseEntity.ok(obj);
......@@ -68,7 +73,7 @@ public class UserDingtalkRegisterResource {
*/
@PostMapping(value = "/uaa/queryDingtalkUserByCode")
public ResponseEntity<JSONObject> queryDingtalkUserByCode(@RequestParam(value = "id",required = false) String id,@RequestParam(value = "code",required = false) String tmpcode,@RequestBody JSONObject param) {
JSONObject object = new JSONObject();
// 空校验
String code = param.getString("code");
if (StringUtils.isEmpty(code))
......@@ -76,38 +81,25 @@ public class UserDingtalkRegisterResource {
if (StringUtils.isEmpty(code))
throw new BadRequestAlertException("code为空", "UserDingtalkRegisterResource", "");
// 从数据库中获取钉钉授权应用信息
SysOpenAccess openAccess = userDingtalkRegisterService.getOpenAccess(id);
if (openAccess==null || (openAccess.getDisabled()!=null && openAccess.getDisabled()==1))
throw new BadRequestAlertException("未找到配置", "UserDingtalkRegisterResource", "");
String appId = openAccess.getAccessKey();// 个人应用开发过程中的唯一性标识AppId
String appSecret = openAccess.getSecretKey();// 个人应用AppSecret
// 通过code获取钉钉用户信息
String openid = null;
String nickname = null;
long currentTimeMillis = System.currentTimeMillis();
JSONObject returnObj = userDingtalkRegisterService.requestDingtalkUserByCode(code, currentTimeMillis, appId, appSecret);
if (!StringUtils.isEmpty(returnObj) && !returnObj.containsKey("errcode")) {
openid = returnObj.getString("openid");
nickname = returnObj.getString("nick");
object.put("openid", openid);
object.put("nickname", nickname);
}
return ResponseEntity.ok().body(getUserBySnsCode(id,code));
}
// 根据openid查用户授权信息
SysUserAuth userAuth = sysUserAuthService.getOne(Wrappers.<SysUserAuth>lambdaQuery().eq(SysUserAuth::getIdentityType,"dingtalk").eq(SysUserAuth::getIdentifier, openid));
// 该钉钉用户注册过账号,登录系统
if (!StringUtils.isEmpty(userAuth)) {
IBZUSER ibzuser = ibzuserService.getById(userAuth.getUserid());
JSONObject ibzuserObj = new JSONObject();
ibzuserObj.put("loginname", ibzuser.getLoginname());
ibzuserObj.put("password", ibzuser.getPassword());
object.put("ibzuser", ibzuserObj);
@GetMapping(value = "/uaa/open/dingtalk/sns/{code}")
public ResponseEntity<JSONObject> getUserBySnsToken(@PathVariable(value = "code") String code, @RequestParam(value = "id",required = false) String id) {
if (StringUtils.isEmpty(code))
throw new BadRequestAlertException("code为空", "UserDingtalkRegisterResource", "");
return ResponseEntity.ok().body(getUserBySnsCode(id,code));
}
private JSONObject getUserBySnsCode(String id,String code)
{
JSONObject object = userDingtalkRegisterService.getUserBySnsToken(id,code);
if (!StringUtils.isEmpty(object.getString("username"))) {
String username = object.getString("username");
// 生成登录token信息
userDetailsService.resetByUsername(ibzuser.getLoginname());
AuthenticationUser user = userDetailsService.loadUserByLogin(ibzuser.getLoginname(), ibzuser.getPassword());
userDetailsService.resetByUsername(username);
AuthenticationUser user = userDetailsService.loadUserByUsername(username);
final String token = jwtTokenUtil.generateToken(user);
AuthenticationUser user2 = new AuthenticationUser();
CachedBeanCopier.copy(user, user2);
......@@ -116,8 +108,7 @@ public class UserDingtalkRegisterResource {
object.put("token", token);
object.put("user", user2);
}
return ResponseEntity.ok().body(object);
return object;
}
......@@ -127,14 +118,18 @@ public class UserDingtalkRegisterResource {
* @param param
* @return
*/
@PostMapping(value = "/uaa/bindDingtalkToRegister")
public ResponseEntity<JSONObject> bindDingtalkToRegister(@RequestBody JSONObject param) {
JSONObject object = new JSONObject();
@PostMapping(value = {"/uaa/bindDingtalkToRegister","/uaa/open/dingtalk/bind"})
public ResponseEntity<AuthenticationInfo> bindDingtalkToRegister(@RequestBody JSONObject param) {
// 空校验
String loginname = param.getString("loginname");
String password = param.getString("password");
String openid = param.getString("openid");
String nickname = param.getString("nickname");
String personname = param.getString("personname");
String phone = param.getString("phone");
String email = param.getString("email");
String domains = param.getString("domains");
if (StringUtils.isEmpty(loginname))
throw new BadRequestAlertException("用户名为空", "UserDingtalkRegisterResource", "");
if (StringUtils.isEmpty(password))
......@@ -146,40 +141,33 @@ public class UserDingtalkRegisterResource {
// 钉钉用户注册
IBZUSER ibzuser = new IBZUSER();
String uuid = UUID.randomUUID().toString();
ibzuser.setPassword(password);
ibzuser.setLoginname(loginname);
ibzuser.setUserid("dingtalk-" + uuid);
ibzuser.setPersonname(nickname);
ibzuser.setPersonname(StringUtils.isEmpty(personname)?nickname:personname);
ibzuser.setNickname(nickname);
userDingtalkRegisterService.toRegister(ibzuser);
// 创建钉钉用户授权信息
ibzuser.setPhone(phone);
ibzuser.setEmail(email);
ibzuser.setDomains(domains);
SysUserAuth userAuth = new SysUserAuth();
userAuth.setUserid(ibzuser.getUserid());
userAuth.setIdentifier(openid);
userAuth.setIdentityType("dingtalk");
userDingtalkRegisterService.toCreateUserAuth(userAuth);
// 注册成功,登录系统
if (!StringUtils.isEmpty(ibzuser)) {
JSONObject ibzuserObj = new JSONObject();
ibzuserObj.put("loginname", ibzuser.getLoginname());
ibzuserObj.put("password", ibzuser.getPassword());
object.put("ibzuser", ibzuserObj);
}
userRegisterService.toRegister(ibzuser,userAuth);
// 生成登录token信息
userDetailsService.resetByUsername(ibzuser.getLoginname());
AuthenticationUser user = userDetailsService.loadUserByLogin(ibzuser.getLoginname(), ibzuser.getPassword());
userDetailsService.resetByUsername(ibzuser.getLoginname()+(StringUtils.isEmpty(ibzuser.getDomains())?"":("|"+ibzuser.getDomains())));
AuthenticationUser user = userDetailsService.loadUserByUsername(ibzuser.getLoginname()+(StringUtils.isEmpty(ibzuser.getDomains())?"":("|"+ibzuser.getDomains())));
final String token = jwtTokenUtil.generateToken(user);
AuthenticationUser user2 = new AuthenticationUser();
CachedBeanCopier.copy(user, user2);
user2.setAuthorities(null);
user2.setPermissionList(null);
object.put("token", token);
object.put("user", user2);
return ResponseEntity.ok().body(object);
return ResponseEntity.ok().body(new AuthenticationInfo(token,user2));
}
......
package cn.ibizlab.api.rest.extensions;
import cn.ibizlab.core.uaa.extensions.service.UserRegisterService;
import cn.ibizlab.core.uaa.service.ISysPSSystemService;
import cn.ibizlab.util.domain.IBZUSER;
import cn.ibizlab.util.errors.BadRequestAlertException;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@RestController
......@@ -23,51 +16,13 @@ public class UserRegisterResource {
@Autowired
private UserRegisterService userRegisterService;
@Autowired
private ISysPSSystemService iSysPSSystemService;
/**
* 普通注册
*
* @param param
* @return
*/
@PostMapping(value = "/uaa/register")
public ResponseEntity<JSONObject> register(@RequestBody JSONObject param) {
JSONObject object = new JSONObject();
// 空校验
String loginname = param.getString("loginname");
String personname = param.getString("personname");
String password = param.getString("password");
String registerType = param.getString("registerType");
if (StringUtils.isEmpty(loginname))
throw new BadRequestAlertException("用户名为空", "UserRegisterResource", "");
if (StringUtils.isEmpty(personname) && (!"qq".equals(registerType) && !"wechat".equals(registerType)))
throw new BadRequestAlertException("用户姓名为空", "UserRegisterResource", "");
if (StringUtils.isEmpty(password))
throw new BadRequestAlertException("密码为空", "UserRegisterResource", "");
if (StringUtils.isEmpty(registerType))
throw new BadRequestAlertException("注册方式为空", "UserRegisterResource", "");
// 检查用户名是否已被注册
String sql = "select loginname from ibzuser where loginname=#{et.loginname}";
Map<String, Object> sqlParam = new HashMap<>();
sqlParam.put("loginname", loginname);
List<JSONObject> select = iSysPSSystemService.select(sql, sqlParam);
if (select.size() > 0)
throw new BadRequestAlertException("该用户名已被注册", "UserRegisterResource", "");
// 注册
IBZUSER ibzuser = new IBZUSER();
String uuid = UUID.randomUUID().toString();
ibzuser.setPersonname(personname);
ibzuser.setPassword(password);
ibzuser.setLoginname(loginname);
ibzuser.setUserid("commom-" + uuid);
userRegisterService.toRegister(ibzuser);
public ResponseEntity<JSONObject> register(@RequestBody IBZUSER ibzuser) {
JSONObject object = new JSONObject();
// 响应结果
object.put("ibzuser", ibzuser);
object.put("ibzuser", userRegisterService.toRegister(ibzuser));
return ResponseEntity.ok().body(object);
}
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册