bt-xtgxq-system-user-center/src/main/java/com/cm/serviceusercenter/authentication/dingding/DingDingAuthenticationProvider.java
2020-11-28 12:52:57 +08:00

110 lines
5.3 KiB
Java

package com.cm.serviceusercenter.authentication.dingding;
import com.cm.common.dingding.service.IDingDingAppUserService;
import com.cm.common.exception.SearchException;
import com.cm.common.pojo.bos.UserBO;
import com.cm.serviceusercenter.authentication.user.UserAuthenticationToken;
import com.cm.serviceusercenter.config.properties.DingDingScanCodeLoginProperties;
import com.cm.serviceusercenter.enums.LoginType;
import com.cm.serviceusercenter.exception.UserAuthenticationException;
import com.cm.serviceusercenter.service.UserLoginService;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.request.OapiSnsGetuserinfoBycodeRequest;
import com.dingtalk.api.response.OapiSnsGetuserinfoBycodeResponse;
import com.dingtalk.api.response.OapiUserGetResponse;
import com.taobao.api.ApiException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetailsService;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候,想想当初你为何开始
*
* @ClassName: DingDingAuthenticationProvider
* @Description: 钉钉登陆认证
* @Author: WangGeng
* @Date: 2020/8/31 15:10
* @Version: 1.0
**/
public class DingDingAuthenticationProvider implements AuthenticationProvider {
private static final Logger LOG = LoggerFactory.getLogger(DingDingAuthenticationProvider.class);
private DingDingScanCodeLoginProperties dingDingScanCodeLoginProperties;
private IDingDingAppUserService dingDingAppUserService;
private UserDetailsService userDetailsService;
private UserLoginService userLoginService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
DingDingAuthenticationToken dingDingAuthenticationToken = (DingDingAuthenticationToken) authentication;
String userMobile = null;
try {
String unionId = getUnionIdByTmpAuthCode(dingDingAuthenticationToken.getPrincipal().toString());
String userId = dingDingAppUserService.getUserIdByUnionId(unionId);
OapiUserGetResponse oapiUserGetResponse = dingDingAppUserService.getUserByUserId(userId);
userMobile = oapiUserGetResponse.getMobile();
} catch (SearchException e) {
throw new UserAuthenticationException(e.getMessage());
}
if (StringUtils.isBlank(userMobile)) {
throw new UserAuthenticationException("钉钉账号未绑定手机号,请绑定后再试");
}
UserBO userBO = (UserBO) userDetailsService.loadUserByUsername(userMobile);
if (userBO == null) {
throw new UserAuthenticationException("该钉钉手机号账号不在系统中,请联系管理员");
}
userLoginService.updateUserLoginInfo(userBO.getUserId(), userBO.getUserName(), LoginType.DING_DING_SCAN_CODE.getValue());
DingDingAuthenticationToken dingDingAuthenticationTokenResult = new DingDingAuthenticationToken(userBO, null, userBO.getAuthorities());
dingDingAuthenticationTokenResult.setDetails(dingDingAuthenticationToken.getDetails());
return dingDingAuthenticationTokenResult;
}
@Override
public boolean supports(Class<?> authentication) {
return DingDingAuthenticationToken.class.isAssignableFrom(authentication);
}
public void setDingDingScanCodeLoginProperties(DingDingScanCodeLoginProperties dingDingScanCodeLoginProperties) {
this.dingDingScanCodeLoginProperties = dingDingScanCodeLoginProperties;
}
public void setDingDingAppUserService(IDingDingAppUserService dingDingAppUserService) {
this.dingDingAppUserService = dingDingAppUserService;
}
public void setUserDetailsService(UserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
}
public void setUserLoginService(UserLoginService userLoginService) {
this.userLoginService = userLoginService;
}
/**
* 获取用户unionId
*
* @param tmpAuthCode
* @return
*/
private String getUnionIdByTmpAuthCode(String tmpAuthCode) {
DefaultDingTalkClient defaultDingTalkClient = new DefaultDingTalkClient(dingDingScanCodeLoginProperties.getUserinfoUrl());
OapiSnsGetuserinfoBycodeRequest oapiSnsGetuserinfoBycodeRequest = new OapiSnsGetuserinfoBycodeRequest();
oapiSnsGetuserinfoBycodeRequest.setTmpAuthCode(tmpAuthCode);
try {
OapiSnsGetuserinfoBycodeResponse oapiSnsGetuserinfoBycodeResponse = defaultDingTalkClient.execute(oapiSnsGetuserinfoBycodeRequest, dingDingScanCodeLoginProperties.getAppId(), dingDingScanCodeLoginProperties.getAppSecret());
if (oapiSnsGetuserinfoBycodeResponse.getErrcode() != 0) {
throw new SearchException(oapiSnsGetuserinfoBycodeResponse.getErrmsg());
}
return oapiSnsGetuserinfoBycodeResponse.getUserInfo().getUnionid();
} catch (ApiException e) {
LOG.error(e.getMessage(), e);
throw new SearchException("钉钉扫码失败");
}
}
}