login.js 增量代码
//查询钉钉信息
export function dingLogin(code) {
return request({
url: '/dingLogin?code=' + code,
headers: {
isToken: false
},
method: 'post'
})
}
user.js 增量代码
actions: {
dingLogin({commit},token){
return new Promise((resolve,reject)=>{
setToken(token)
commit('SET_TOKEN', token)
resolve()
})
}
}
login.vue 增量代码
import { getCodeImg, dingLogin } from "@/api/login";
mounted() {
// 钉钉登录
this.handleGetDingLoginInfo(()=>{
this.handleDingLogin();
});
},
methods: {
// 获取钉钉配置信息
handleGetDingLoginInfo(callback){
callback();
},
handleDingLogin(){
if(this.$route.query){
var jsonStr = JSON.stringify(this.$route.query);
let string = jsonStr.split('authCode=')[1];
if(string){
this.$route.query.authCode = string.substring(0, 32);
}
}
if (!this.$route.query.authCode) {
window.location.href='https://login.dingtalk.com/oauth2/auth?' +
'redirect_uri=' + 'http%3A%2F%2F127.0.0.1:80%2Findex' +
'&response_type=code' +
'&client_id=' + APPID +
'&scope=snsapi_login' +
'&state=dddd' +
'&prompt=consent'
} else {
dingLogin(this.$route.query.authCode)
.then(resp=>{
if(resp.code === 500){
this.$notify.error({
title: '错误',
message: '没有查询到你的登录权限。请关闭重新打开,或联系管理员授权',
duration: 0
});
}else{
this.$store.dispatch('dingLogin',resp.token).then(resp=>{
this.$notify({
title: '成功',
message: '已成功登录系统'
});
this.$router.push({path: "/"})
})
}
})
}
}
}
DingDingService 全量代码
import com.alibaba.fastjson2.JSONObject;
/**
* write something here
*
* @author xuyt
* @date 2023/3/29
**/
public interface DingDingService {
String getDingLogin(String code) throws Exception;
}
DingDingServiceImpl 全量代码
import com.alibaba.fastjson2.JSONObject;
import com.aliyun.dingtalkcontact_1_0.models.GetUserHeaders;
import com.aliyun.dingtalkcontact_1_0.models.GetUserResponseBody;
import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenRequest;
import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiUserGetbyunionidRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiUserGetbyunionidResponse;
import org.springframework.stereotype.Service;
/**
* write something here
*
* @author xuyt
* @date 2023/3/29
**/
@Service
public class DingDingServiceImpl implements DingDingService {
private com.aliyun.dingtalkoauth2_1_0.Client authClient() throws Exception {
Config config = new Config();
config.protocol = "https";
config.regionId = "central";
return new com.aliyun.dingtalkoauth2_1_0.Client(config);
}
private com.aliyun.dingtalkcontact_1_0.Client contactClient() throws Exception {
Config config = new Config();
config.protocol = "https";
config.regionId = "central";
return new com.aliyun.dingtalkcontact_1_0.Client(config);
}
/**
* 获取用户个人信息
*
* @param accessToken
* @return
* @throws Exception
*/
private GetUserResponseBody getUserinfo(String accessToken) throws Exception {
com.aliyun.dingtalkcontact_1_0.Client client = contactClient();
GetUserHeaders getUserHeaders = new GetUserHeaders();
getUserHeaders.xAcsDingtalkAccessToken = accessToken;
//获取用户个人信息
return client.getUserWithOptions("me", getUserHeaders, new RuntimeOptions()).getBody();
}
/**
* 通过扫描二维码返回的code值,得到用户相关信息
*/
@Override
public String getDingLogin(String authCode) throws Exception {
com.aliyun.dingtalkoauth2_1_0.Client client = authClient();
GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()
//应用基础信息-应用信息的AppKey,请务必替换为开发的应用AppKey
.setClientId("APPID")
//应用基础信息-应用信息的AppSecret,,请务必替换为开发的应用AppSecret
.setClientSecret("APPSECRET")
.setCode(authCode)
.setGrantType("authorization_code");
GetUserTokenResponse getUserTokenResponse = client.getUserToken(getUserTokenRequest);
//获取用户个人token
String accessToken = getUserTokenResponse.getBody().getAccessToken();
System.out.println(accessToken);
//获取钉钉用户信息
GetUserResponseBody me = getUserinfo(accessToken);
//获取 token
DingTalkClient client4 = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
request.setAppkey("APPID");
request.setAppsecret("APPSECRET");
request.setHttpMethod("GET");
OapiGettokenResponse response = client4.execute(request);
System.out.println(response.getBody());
//根据 unionId 获取 userId
DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
OapiUserGetbyunionidRequest req1 = new OapiUserGetbyunionidRequest();
req1.setHttpMethod("POST");
req1.setUnionid(me.getUnionId());
OapiUserGetbyunionidResponse rsp = client1.execute(req1, response.getAccessToken());
JSONObject json = JSONObject.parseObject(rsp.getBody());
JSONObject result = JSONObject.parseObject(json.getString("result"));
return result.getString("userid");
}
}
SysLoginController 全量代码
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.service.DingDingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.system.service.ISysMenuService;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登录验证
*
* @author ruoyi
*/
@RestController
public class SysLoginController
{
@Autowired
private SysLoginService loginService;
@Autowired
private ISysMenuService menuService;
@Autowired
private SysPermissionService permissionService;
@Autowired
private ISysUserService sysUserService;
@Resource
private UserDetailsService userDetailsService;
@Resource
private TokenService tokenService;
/**
* 登录方法
*
* @param loginBody 登录信息
* @return 结果
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
}
/**
* 获取用户信息
*
* @return 用户信息
*/
@GetMapping("getInfo")
public AjaxResult getInfo()
{
SysUser user = SecurityUtils.getLoginUser().getUser();
// 角色集合
Set<String> roles = permissionService.getRolePermission(user);
// 权限集合
Set<String> permissions = permissionService.getMenuPermission(user);
AjaxResult ajax = AjaxResult.success();
ajax.put("user", user);
ajax.put("roles", roles);
ajax.put("permissions", permissions);
return ajax;
}
/**
* 获取路由信息
*
* @return 路由信息
*/
@GetMapping("getRouters")
public AjaxResult getRouters()
{
Long userId = SecurityUtils.getUserId();
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus));
}
@Autowired
private DingDingService dingDingService;
/**
* 获取用户信息
*
* @return 用户信息
*/
@PostMapping(value="/dingLogin")
public AjaxResult dingLogin(String code) throws Exception {
String userId = dingDingService.getDingLogin(code);
SysUser sysUser = sysUserService.selectUserByUserName(userId);
if (sysUser == null) {
throw new Exception();
}
LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(userId);
// 生成token
AjaxResult ajax = AjaxResult.success();
ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
return ajax;
}
}
pom.xml 增量代码
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dingtalk</artifactId>
<version>1.1.86</version>
</dependency>
</dependencies>
SecurityConfig 增量代码
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage", "/common/**", "/dingLogin").permitAll()
UserDetailsServiceImpl 减少代码
//passwordService.validate(user);
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。