diff --git a/mini-program-test/.eslintrc.js b/mini-program-test/.eslintrc.js
new file mode 100755
index 0000000000..115cc02b04
--- /dev/null
+++ b/mini-program-test/.eslintrc.js
@@ -0,0 +1,31 @@
+/*
+ * Eslint config file
+ * Documentation: https://eslint.org/docs/user-guide/configuring/
+ * Install the Eslint extension before using this feature.
+ */
+module.exports = {
+ env: {
+ es6: true,
+ browser: true,
+ node: true,
+ },
+ ecmaFeatures: {
+ modules: true,
+ },
+ parserOptions: {
+ ecmaVersion: 2018,
+ sourceType: 'module',
+ },
+ globals: {
+ wx: true,
+ App: true,
+ Page: true,
+ getCurrentPages: true,
+ getApp: true,
+ Component: true,
+ requirePlugin: true,
+ requireMiniProgram: true,
+ },
+ // extends: 'eslint:recommended',
+ rules: {},
+}
diff --git a/mini-program-test/README.md b/mini-program-test/README.md
new file mode 100644
index 0000000000..4e5737ccbc
--- /dev/null
+++ b/mini-program-test/README.md
@@ -0,0 +1 @@
+临时项目,作为测试微信小程序登陆之用
diff --git a/mini-program-test/app.js b/mini-program-test/app.js
new file mode 100755
index 0000000000..1ed57c47fc
--- /dev/null
+++ b/mini-program-test/app.js
@@ -0,0 +1,19 @@
+// app.js
+App({
+ onLaunch() {
+ // 展示本地存储能力
+ const logs = wx.getStorageSync('logs') || []
+ logs.unshift(Date.now())
+ wx.setStorageSync('logs', logs)
+
+ // 登录
+ wx.login({
+ success: res => {
+ // 发送 res.code 到后台换取 openId, sessionKey, unionId
+ }
+ })
+ },
+ globalData: {
+ userInfo: null
+ }
+})
diff --git a/mini-program-test/app.json b/mini-program-test/app.json
new file mode 100755
index 0000000000..3d7616ff47
--- /dev/null
+++ b/mini-program-test/app.json
@@ -0,0 +1,14 @@
+{
+ "pages":[
+ "pages/index/index",
+ "pages/logs/logs"
+ ],
+ "window":{
+ "backgroundTextStyle":"light",
+ "navigationBarBackgroundColor": "#fff",
+ "navigationBarTitleText": "Weixin",
+ "navigationBarTextStyle":"black"
+ },
+ "style": "v2",
+ "sitemapLocation": "sitemap.json"
+}
diff --git a/mini-program-test/app.wxss b/mini-program-test/app.wxss
new file mode 100755
index 0000000000..06c6fc9ce3
--- /dev/null
+++ b/mini-program-test/app.wxss
@@ -0,0 +1,10 @@
+/**app.wxss**/
+.container {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+ padding: 200rpx 0;
+ box-sizing: border-box;
+}
diff --git a/mini-program-test/pages/index/index.js b/mini-program-test/pages/index/index.js
new file mode 100755
index 0000000000..eadb684cfe
--- /dev/null
+++ b/mini-program-test/pages/index/index.js
@@ -0,0 +1,91 @@
+// index.js
+
+const common=require('../../utils/common.js')
+// 获取应用实例
+const app = getApp()
+
+Page({
+ data: {
+ motto: 'Hello World',
+ userInfo: {},
+ hasUserInfo: false,
+ canIUse: wx.canIUse('button.open-type.getUserInfo'),
+ canIUseGetUserProfile: false,
+ canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName'), // 如需尝试获取用户信息可改为false
+ holderText: 'to be auth'
+ },
+ // 事件处理函数
+ bindViewTap() {
+ wx.navigateTo({
+ url: '../logs/logs'
+ })
+ },
+ onLoad() {
+ if (wx.getUserProfile) {
+ this.setData({
+ canIUseGetUserProfile: true
+ })
+ }
+ },
+ getUserProfile(e) {
+ // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
+ wx.getUserProfile({
+ desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
+ success: (res) => {
+ console.log(res)
+ this.setData({
+ userInfo: res.userInfo,
+ hasUserInfo: true
+ })
+ }
+ })
+ },
+ getUserInfo(e) {
+ // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
+ console.log(e)
+ this.setData({
+ userInfo: e.detail.userInfo,
+ hasUserInfo: true
+ })
+ },
+ // 小程序登录 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
+ wxLogin(e){
+ let page=this;
+ wx.login({
+ success (res) {
+ console.log("res:")
+ console.log(res)
+ if (res.code) {
+ //发起网络请求
+ console.log('发起网络请求'+common.baseurl)
+ wx.request({
+ url: common.baseurl+'/api/social-login2',
+ method: "POST",
+ data: {
+ code: res.code,
+ state: 'empty',
+ type: 33,
+ username: '15601691300',
+ password: 'admin123'
+ },
+ header: {
+ 'content-type': 'application/json' // 默认值
+ },
+ success: function(res) {
+ console.log(res.data)
+ let holder="auth success, token:"+res.data.data.token
+ page.setData({holderText: holder})
+ },
+ fail: function(data){
+ console.error("请求出错");
+ console.error(data)
+ }
+
+ })
+ } else {
+ console.log('登录失败!' + res.errMsg)
+ }
+ }
+ })
+ }
+})
diff --git a/mini-program-test/pages/index/index.json b/mini-program-test/pages/index/index.json
new file mode 100755
index 0000000000..8835af0699
--- /dev/null
+++ b/mini-program-test/pages/index/index.json
@@ -0,0 +1,3 @@
+{
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/mini-program-test/pages/index/index.wxml b/mini-program-test/pages/index/index.wxml
new file mode 100755
index 0000000000..e3243c3e04
--- /dev/null
+++ b/mini-program-test/pages/index/index.wxml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+ 请使用1.4.4及以上版本基础库
+
+
+
+ {{userInfo.nickName}}
+
+
+
+
+
+
+
+
+ 授权登录测试1024
+
+
+
+ {{holderText}}
+
diff --git a/mini-program-test/pages/index/index.wxss b/mini-program-test/pages/index/index.wxss
new file mode 100755
index 0000000000..eb642035f7
--- /dev/null
+++ b/mini-program-test/pages/index/index.wxss
@@ -0,0 +1,19 @@
+/**index.wxss**/
+.userinfo {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ color: #aaa;
+}
+
+.userinfo-avatar {
+ overflow: hidden;
+ width: 128rpx;
+ height: 128rpx;
+ margin: 20rpx;
+ border-radius: 50%;
+}
+
+.usermotto {
+ margin-top: 200px;
+}
\ No newline at end of file
diff --git a/mini-program-test/pages/logs/logs.js b/mini-program-test/pages/logs/logs.js
new file mode 100755
index 0000000000..85f6aac5ab
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.js
@@ -0,0 +1,18 @@
+// logs.js
+const util = require('../../utils/util.js')
+
+Page({
+ data: {
+ logs: []
+ },
+ onLoad() {
+ this.setData({
+ logs: (wx.getStorageSync('logs') || []).map(log => {
+ return {
+ date: util.formatTime(new Date(log)),
+ timeStamp: log
+ }
+ })
+ })
+ }
+})
diff --git a/mini-program-test/pages/logs/logs.json b/mini-program-test/pages/logs/logs.json
new file mode 100755
index 0000000000..3ee76c183c
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.json
@@ -0,0 +1,4 @@
+{
+ "navigationBarTitleText": "查看启动日志",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/mini-program-test/pages/logs/logs.wxml b/mini-program-test/pages/logs/logs.wxml
new file mode 100755
index 0000000000..0b6b6456f7
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.wxml
@@ -0,0 +1,6 @@
+
+
+
+ {{index + 1}}. {{log.date}}
+
+
diff --git a/mini-program-test/pages/logs/logs.wxss b/mini-program-test/pages/logs/logs.wxss
new file mode 100755
index 0000000000..94d4b88a27
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.wxss
@@ -0,0 +1,8 @@
+.log-list {
+ display: flex;
+ flex-direction: column;
+ padding: 40rpx;
+}
+.log-item {
+ margin: 10rpx;
+}
diff --git a/mini-program-test/project.config.json b/mini-program-test/project.config.json
new file mode 100755
index 0000000000..2fbe955c6f
--- /dev/null
+++ b/mini-program-test/project.config.json
@@ -0,0 +1,75 @@
+{
+ "description": "项目配置文件",
+ "packOptions": {
+ "ignore": [
+ {
+ "type": "file",
+ "value": ".eslintrc.js"
+ }
+ ]
+ },
+ "setting": {
+ "bundle": false,
+ "userConfirmedBundleSwitch": false,
+ "urlCheck": true,
+ "scopeDataCheck": false,
+ "coverView": true,
+ "es6": true,
+ "postcss": true,
+ "compileHotReLoad": false,
+ "lazyloadPlaceholderEnable": false,
+ "preloadBackgroundData": false,
+ "minified": true,
+ "autoAudits": false,
+ "newFeature": false,
+ "uglifyFileName": false,
+ "uploadWithSourceMap": true,
+ "useIsolateContext": true,
+ "nodeModules": false,
+ "enhance": true,
+ "useMultiFrameRuntime": true,
+ "useApiHook": true,
+ "useApiHostProcess": true,
+ "showShadowRootInWxmlPanel": true,
+ "packNpmManually": false,
+ "enableEngineNative": false,
+ "packNpmRelationList": [],
+ "minifyWXSS": true,
+ "showES6CompileOption": false,
+ "minifyWXML": true
+ },
+ "compileType": "miniprogram",
+ "libVersion": "2.19.4",
+ "appid": "wx44d047d87e6284d8",
+ "appid1": "wx63c280fe3248a3e7",
+ "projectname": "mini-program-test",
+ "debugOptions": {
+ "hidedInDevtools": []
+ },
+ "scripts": {},
+ "staticServerOptions": {
+ "baseURL": "",
+ "servePath": ""
+ },
+ "isGameTourist": false,
+ "condition": {
+ "search": {
+ "list": []
+ },
+ "conversation": {
+ "list": []
+ },
+ "game": {
+ "list": []
+ },
+ "plugin": {
+ "list": []
+ },
+ "gamePlugin": {
+ "list": []
+ },
+ "miniprogram": {
+ "list": []
+ }
+ }
+}
\ No newline at end of file
diff --git a/mini-program-test/sitemap.json b/mini-program-test/sitemap.json
new file mode 100755
index 0000000000..ca02add20b
--- /dev/null
+++ b/mini-program-test/sitemap.json
@@ -0,0 +1,7 @@
+{
+ "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
+ "rules": [{
+ "action": "allow",
+ "page": "*"
+ }]
+}
\ No newline at end of file
diff --git a/mini-program-test/utils/common.js b/mini-program-test/utils/common.js
new file mode 100755
index 0000000000..a52d725204
--- /dev/null
+++ b/mini-program-test/utils/common.js
@@ -0,0 +1,3 @@
+module.exports = {
+ baseurl: "http://127.0.0.1:28080"
+}
diff --git a/mini-program-test/utils/util.js b/mini-program-test/utils/util.js
new file mode 100755
index 0000000000..764bc2ce26
--- /dev/null
+++ b/mini-program-test/utils/util.js
@@ -0,0 +1,19 @@
+const formatTime = date => {
+ const year = date.getFullYear()
+ const month = date.getMonth() + 1
+ const day = date.getDate()
+ const hour = date.getHours()
+ const minute = date.getMinutes()
+ const second = date.getSeconds()
+
+ return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
+}
+
+const formatNumber = n => {
+ n = n.toString()
+ return n[1] ? n : `0${n}`
+}
+
+module.exports = {
+ formatTime
+}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
index b87deaca97..16130e17ea 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
@@ -8,10 +8,11 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum
import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
@@ -132,7 +133,7 @@ public class SysAuthController {
@DeleteMapping("/social-unbind")
@ApiOperation("取消社交绑定")
public CommonResult socialUnbind(@RequestBody SysAuthSocialUnbindReqVO reqVO) {
- socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId());
+ socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.ADMIN);
return CommonResult.success(true);
}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java
index 66d05cedfe..e92d3fc504 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java
@@ -1,6 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java
index bedf8ba3e8..13aaa71cc7 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java
@@ -1,6 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java
index b34022d4fd..71d19685d0 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java
@@ -1,6 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java
index 71cdc6fbb6..096164ed70 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java
@@ -1,6 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
index 523359b086..48236a7abf 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
@@ -8,15 +8,16 @@ import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import io.swagger.annotations.Api;
@@ -77,7 +78,7 @@ public class SysUserProfileController {
resp.setPosts(SysUserConvert.INSTANCE.convertList02(posts));
}
// 获得社交用户信息
- List socialUsers = socialService.getSocialUserList(user.getId());
+ List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN);
resp.setSocialUsers(SysUserConvert.INSTANCE.convertList03(socialUsers));
return success(resp);
}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
index dbe5b365fb..d25ce02add 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
@@ -7,7 +7,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java
index e7c484bb02..e9d3373b25 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java
@@ -19,12 +19,5 @@ public interface SysRedisKeyConstants {
"captcha_code:%s", // 参数为 uuid
STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
- RedisKeyDefine SOCIAL_AUTH_USER = new RedisKeyDefine("社交的授权用户",
- "social_auth_user:%d:%s", // 参数为 type,code
- STRING, AuthUser.class, Duration.ofDays(1));
-
- RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交的 state",
- "social_auth_state:%s", // 参数为 state
- STRING, String.class, Duration.ofHours(24)); // 值为 state
}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
index 0fad26be80..7da1f42393 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
@@ -89,8 +89,6 @@ public interface SysErrorCodeConstants {
ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在");
ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码");
- // ========== 社交模块 1002014000 ==========
- ErrorCode SOCIAL_AUTH_FAILURE = new ErrorCode(1002014000, "社交授权失败,原因是:{}");
- ErrorCode SOCIAL_UNBIND_NOT_SELF = new ErrorCode(1002014001, "社交解绑失败,非当前用户绑定");
+
}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/social/SysSocialTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/social/SysSocialTypeEnum.java
deleted file mode 100644
index 87d762dcec..0000000000
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/social/SysSocialTypeEnum.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package cn.iocoder.yudao.adminserver.modules.system.enums.social;
-
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.util.ArrayUtil;
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 社交平台的类型枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum SysSocialTypeEnum implements IntArrayValuable {
-
- GITEE(10, "GITEE"), // https://gitee.com/api/v5/oauth_doc#/
- DINGTALK(20, "DINGTALK"), // https://developers.dingtalk.com/document/app/obtain-identity-credentials
- WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"), // https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html
- ;
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSocialTypeEnum::getType).toArray();
-
- public static final List WECHAT_ALL = ListUtil.toList(WECHAT_ENTERPRISE.type);
-
- /**
- * 类型
- */
- private final Integer type;
- /**
- * 类型的标识
- */
- private final String source;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
- public static SysSocialTypeEnum valueOfType(Integer type) {
- return ArrayUtil.firstMatch(o -> o.getType().equals(type), values());
- }
-
- public static List getRelationTypes(Integer type) {
- if (WECHAT_ALL.contains(type)) {
- return WECHAT_ALL;
- }
- return ListUtil.toList(type);
- }
-
-}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
index d5fb91f95d..558967c2e6 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -6,18 +6,18 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAu
import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO;
import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO;
import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@@ -75,6 +75,9 @@ public class SysAuthServiceImpl implements SysAuthService {
@Resource
private SysSocialService socialService;
+ // TODO @timfruit:静态枚举类,需要都大写,例如说 USER_TYPE_ENUM;静态变量,放在普通变量前面;这个实践不错哈。
+ private static final UserTypeEnum userTypeEnum = UserTypeEnum.ADMIN;
+
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 获取 username 对应的 SysUserDO
@@ -198,7 +201,7 @@ public class SysAuthServiceImpl implements SysAuthService {
// 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错
String unionId = socialService.getAuthUserUnionId(authUser);
- List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId);
+ List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, userTypeEnum);
if (CollUtil.isEmpty(socialUsers)) {
throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
}
@@ -212,11 +215,10 @@ public class SysAuthServiceImpl implements SysAuthService {
// 创建 LoginUser 对象
LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
- // TODO 芋艿:需要改造下,增加各种登录方式
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表
// 绑定社交用户(更新)
- socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser);
+ socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
// 缓存登录用户到 Redis 中,返回 sessionId 编号
return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
@@ -233,7 +235,7 @@ public class SysAuthServiceImpl implements SysAuthService {
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表
// 绑定社交用户(新增)
- socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser);
+ socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
// 缓存登录用户到 Redis 中,返回 sessionId 编号
return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
@@ -246,7 +248,7 @@ public class SysAuthServiceImpl implements SysAuthService {
Assert.notNull(authUser, "授权用户不为空");
// 绑定社交用户(新增)
- socialService.bindSocialUser(userId, reqVO.getType(), authUser);
+ socialService.bindSocialUser(userId, reqVO.getType(), authUser, userTypeEnum);
}
@Override
@@ -267,7 +269,7 @@ public class SysAuthServiceImpl implements SysAuthService {
reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
reqDTO.setTraceId(TracerUtils.getTraceId());
reqDTO.setUserId(userId);
- reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
+ reqDTO.setUserType(userTypeEnum.getValue());
reqDTO.setUsername(username);
reqDTO.setUserAgent(ServletUtils.getUserAgent());
reqDTO.setUserIp(ServletUtils.getClientIP());
diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
index 51e59dc0aa..c09a194aa8 100644
--- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
+++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
@@ -7,11 +7,11 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEn
import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl;
import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.security.core.LoginUser;
diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java
index badaf0e760..cec84c1ed6 100644
--- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java
+++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java
@@ -1,11 +1,11 @@
package cn.iocoder.yudao.adminserver.modules.system.service.social;
import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social.SysSocialUserMapper;
-import cn.iocoder.yudao.adminserver.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.impl.SysSocialServiceImpl;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social.SysSocialUserMapper;
+import cn.iocoder.yudao.coreservice.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.impl.SysSocialServiceImpl;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import com.xkcoding.justauth.AuthRequestFactory;
import me.zhyd.oauth.model.AuthUser;
@@ -23,6 +23,7 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.assertEquals;
+// TODO @timfruit:这个单元测试,挪到 yudao-core-service
/**
* {@link SysSocialServiceImpl} 的单元测试类
*
@@ -53,7 +54,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
// mock 方法
// 调用
- socialService.bindSocialUser(userId, type, authUser);
+ socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN);
// 断言
List socialUsers = socialUserMapper.selectList("user_id", userId);
assertEquals(1, socialUsers.size());
@@ -78,7 +79,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
// mock 方法
// 调用
- socialService.bindSocialUser(userId, type, authUser);
+ socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN);
// 断言
List socialUsers = socialUserMapper.selectList("user_id", userId);
assertEquals(1, socialUsers.size());
@@ -103,7 +104,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
// mock 方法
// 调用
- socialService.bindSocialUser(userId, type, authUser);
+ socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN);
// 断言
List socialUsers = socialUserMapper.selectList("user_id", userId);
assertEquals(1, socialUsers.size());
@@ -140,7 +141,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
String newUnionId = oldSocialUser.getUnionId();
// 调用
- socialService.unbindOldSocialUser(userId, type, newUnionId);
+ socialService.unbindOldSocialUser(userId, type, newUnionId, UserTypeEnum.ADMIN);
// 断言
assertEquals(1L, socialUserMapper.selectCount(null).longValue());
}
@@ -163,7 +164,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
String newUnionId = randomString(10);
// 调用
- socialService.unbindOldSocialUser(userId, type, newUnionId);
+ socialService.unbindOldSocialUser(userId, type, newUnionId, UserTypeEnum.ADMIN);
// 断言
assertEquals(0L, socialUserMapper.selectCount(null).longValue());
}
diff --git a/yudao-core-service/pom.xml b/yudao-core-service/pom.xml
index 1182227d69..4fd85c0aac 100644
--- a/yudao-core-service/pom.xml
+++ b/yudao-core-service/pom.xml
@@ -95,6 +95,13 @@
com.google.guava
guava
+
+
+
+ com.xkcoding.justauth
+ justauth-spring-boot-starter
+
+
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendSource.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendSource.java
new file mode 100644
index 0000000000..e005114ac4
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendSource.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.coreservice.modules.system.compent.justauth;
+
+import me.zhyd.oauth.config.AuthSource;
+
+public enum AuthExtendSource implements AuthSource {
+
+ /**
+ * 微信小程序授权登录
+ */
+ WECHAT_MINI_PROGRAM{
+ @Override
+ public String authorize() {
+ // https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
+ throw new UnsupportedOperationException("不支持获取授权url, 请使用小程序内置函数wx.login()登录获取code");
+ }
+
+ @Override
+ public String accessToken() {
+ // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
+ // 获取openid, unionid , session_key
+ return "https://api.weixin.qq.com/sns/jscode2session";
+ }
+
+ @Override
+ public String userInfo() {
+ //https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html
+ throw new UnsupportedOperationException("不支持获取用户信息url, 请使用小程序内置函数wx.getUserProfile()获取用户信息");
+ }
+ }
+
+ ;
+
+}
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendToken.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendToken.java
new file mode 100644
index 0000000000..2ecb0d4616
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendToken.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.coreservice.modules.system.compent.justauth;
+
+import lombok.*;
+import me.zhyd.oauth.model.AuthToken;
+
+/**
+ * TODO @timfruit:类注释
+ * @author timfruit
+ * @date 2021-10-29
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class AuthExtendToken extends AuthToken {
+
+ /**
+ * 微信小程序 会话密钥
+ */
+ private String miniSessionKey;
+
+}
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthWeChatMiniProgramRequest.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthWeChatMiniProgramRequest.java
new file mode 100644
index 0000000000..664f9157f1
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthWeChatMiniProgramRequest.java
@@ -0,0 +1,90 @@
+package cn.iocoder.yudao.coreservice.modules.system.compent.justauth;
+
+import com.alibaba.fastjson.JSONObject;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthToken;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.request.AuthDefaultRequest;
+import me.zhyd.oauth.utils.HttpUtils;
+import me.zhyd.oauth.utils.UrlBuilder;
+
+// TODO @timfruit:新建一个 yudao-spring-boot-starter-biz-social 包,把这个拓展拿进去哈。另外,可以思考下。
+// 1. application-local.yaml 的配置里,justauth.extend.enum-class 能否不配置,而是自动配置好
+// 2. application-local.yaml 的配置里,justauth.extend.extend.config.WECHAT_MINI_PROGRAM 有办法和 justauth.type.WECHAT_MP 持平
+/**
+ * 微信小程序登陆
+ *
+ * @author timfruit
+ * @date 2021-10-29
+ */
+public class AuthWeChatMiniProgramRequest extends AuthDefaultRequest {
+
+ public AuthWeChatMiniProgramRequest(AuthConfig config) {
+ super(config, AuthExtendSource.WECHAT_MINI_PROGRAM);
+ }
+
+ public AuthWeChatMiniProgramRequest(AuthConfig config, AuthStateCache authStateCache) {
+ super(config, AuthExtendSource.WECHAT_MINI_PROGRAM, authStateCache);
+ }
+
+ @Override
+ protected AuthToken getAccessToken(AuthCallback authCallback) {
+ // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
+ String response = new HttpUtils(config.getHttpConfig()).get(accessTokenUrl(authCallback.getCode()));
+ JSONObject accessTokenObject = JSONObject.parseObject(response); // TODO @timfruit:使用 JsonUtils,项目尽量避免直接使用某个 json 库
+
+ this.checkResponse(accessTokenObject);
+
+ AuthExtendToken token = new AuthExtendToken();
+ token.setMiniSessionKey(accessTokenObject.getString("session_key"));
+ token.setOpenId(accessTokenObject.getString("openid"));
+ token.setUnionId(accessTokenObject.getString("unionid"));
+ return token;
+ }
+
+ @Override
+ protected AuthUser getUserInfo(AuthToken authToken) {
+ // https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html
+ // 如果需要用户信息,需要在小程序调用函数后传给后端
+ return AuthUser.builder()
+ .uuid(authToken.getOpenId())
+ //TODO 是使用默认值,还是有小程序获取用户信息 和 code 一起传过来
+ .nickname("")
+ .avatar("")
+ .token(authToken)
+ .source(source.toString())
+ .build();
+ }
+
+ /**
+ * 检查响应内容是否正确
+ *
+ * @param object 请求响应内容
+ */
+ private void checkResponse(JSONObject object) {
+ int code = object.getIntValue("errcode");
+ if(code != 0){ // TODO @timfruit:if (code != 0) { ,注意空格
+ throw new AuthException(object.getIntValue("errcode"), object.getString("errmsg"));
+ }
+ }
+
+ /**
+ * 返回获取 accessToken 的 url
+ *
+ * @param code 授权码
+ * @return 返回获取 accessToken 的 url
+ */
+ @Override
+ protected String accessTokenUrl(String code) {
+ return UrlBuilder.fromBaseUrl(source.accessToken())
+ .queryParam("appid", config.getClientId())
+ .queryParam("secret", config.getClientSecret())
+ .queryParam("js_code", code)
+ .queryParam("grant_type", "authorization_code")
+ .build();
+ }
+
+}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java
similarity index 96%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java
index 7e998b8fcf..d1772a1324 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social;
+package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/social/SysSocialUserMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserMapper.java
similarity index 85%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/social/SysSocialUserMapper.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserMapper.java
index b5762ec7fb..ee8db4eac4 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/social/SysSocialUserMapper.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserMapper.java
@@ -1,6 +1,6 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social;
+package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
+// TODO @timfruit:SysSocialUserCoreMapper 改名,方便区分
@Mapper
public interface SysSocialUserMapper extends BaseMapperX {
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java
index fb4118874f..5db3e9fd48 100644
--- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java
@@ -2,6 +2,9 @@ package cn.iocoder.yudao.coreservice.modules.system.dal.redis;
import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
import cn.iocoder.yudao.framework.security.core.LoginUser;
+import me.zhyd.oauth.model.AuthUser;
+
+import java.time.Duration;
import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING;
@@ -16,4 +19,11 @@ public interface SysRedisKeyCoreConstants {
"login_user:%s", // 参数为 sessionId
STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
+ RedisKeyDefine SOCIAL_AUTH_USER = new RedisKeyDefine("社交登陆的授权用户",
+ "social_auth_user:%d:%s", // 参数为 type,code
+ STRING, AuthUser.class, Duration.ofDays(1));
+
+ RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交登陆的 state",
+ "social_auth_state:%s", // 参数为 state
+ STRING, String.class, Duration.ofHours(24)); // 值为 state
}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
similarity index 77%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
index d5e84e62d2..5142810717 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.redis.social;
+package cn.iocoder.yudao.coreservice.modules.system.dal.redis.social;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import me.zhyd.oauth.model.AuthCallback;
@@ -8,10 +8,11 @@ import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
-import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyConstants.SOCIAL_AUTH_USER;
+import static cn.iocoder.yudao.coreservice.modules.system.dal.redis.SysRedisKeyCoreConstants.SOCIAL_AUTH_USER;
+// TODO @timfruit,这里的 AuthUser 还是保留全路径,主要想体现出来,不是自己定义的
/**
- * 社交 {@link me.zhyd.oauth.model.AuthUser} 的 RedisDAO
+ * 社交 {@link AuthUser} 的 RedisDAO
*
* @author 芋道源码
*/
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
index 2fada16514..173287e522 100644
--- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
@@ -18,4 +18,8 @@ public interface SysErrorCodeConstants {
ErrorCode FILE_PATH_EXISTS = new ErrorCode(1006001000, "文件路径已存在");
ErrorCode FILE_NOT_EXISTS = new ErrorCode(1006001002, "文件不存在");
+ // ========== 社交模块 1006002000 ==========
+ ErrorCode SOCIAL_AUTH_FAILURE = new ErrorCode(1006002000, "社交授权失败,原因是:{}");
+ ErrorCode SOCIAL_UNBIND_NOT_SELF = new ErrorCode(1006002001, "社交解绑失败,非当前用户绑定");
+
}
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java
new file mode 100644
index 0000000000..3dba5bda03
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java
@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.coreservice.modules.system.enums.social;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 社交平台的类型枚举
+ *
+ * @author 芋道源码
+ */
+@Getter
+@AllArgsConstructor
+public enum SysSocialTypeEnum implements IntArrayValuable {
+
+ /**
+ * Gitee
+ * 文档链接:https://gitee.com/api/v5/oauth_doc#/
+ */
+ GITEE(10, "GITEE"),
+ /**
+ * 钉钉
+ * 文档链接:https://developers.dingtalk.com/document/app/obtain-identity-credentials
+ */
+ DINGTALK(20, "DINGTALK"),
+
+ /**
+ * 企业微信
+ * 文档链接:https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html
+ */
+ WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"),
+ /**
+ * 微信公众平台 - 移动端 H5
+ * 文档链接:https://www.cnblogs.com/juewuzhe/p/11905461.html
+ */
+ WECHAT_MP(31, "WECHAT_MP"),
+ /**
+ * 微信开放平台 - 网站应用 PC 端扫码授权登录
+ * 文档链接:https://justauth.wiki/guide/oauth/wechat_open/#_2-申请开发者资质认证
+ */
+ WECHAT_OPEN(32, "WECHAT_OPEN"),
+ /**
+ * 微信小程序
+ * 文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
+ */
+ WECHAT_MINI_PROGRAM(33, "WECHAT_MINI_PROGRAM"),
+ ;
+
+ public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSocialTypeEnum::getType).toArray();
+
+ public static final List WECHAT_ALL = ListUtil.toList(WECHAT_ENTERPRISE.type, WECHAT_MP.type, WECHAT_OPEN.type,
+ WECHAT_MINI_PROGRAM.type);
+
+ /**
+ * 类型
+ */
+ private final Integer type;
+ /**
+ * 类型的标识
+ */
+ private final String source;
+
+ @Override
+ public int[] array() {
+ return ARRAYS;
+ }
+
+ public static SysSocialTypeEnum valueOfType(Integer type) {
+ return ArrayUtil.firstMatch(o -> o.getType().equals(type), values());
+ }
+
+ public static List getRelationTypes(Integer type) {
+ if (WECHAT_ALL.contains(type)) {
+ return WECHAT_ALL;
+ }
+ return ListUtil.toList(type);
+ }
+
+}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialService.java
similarity index 78%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialService.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialService.java
index 44dfad63a5..8a8df27d65 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialService.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialService.java
@@ -1,8 +1,9 @@
-package cn.iocoder.yudao.adminserver.modules.system.service.social;
+package cn.iocoder.yudao.coreservice.modules.system.service.social;
import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import me.zhyd.oauth.model.AuthUser;
@@ -14,6 +15,7 @@ import java.util.List;
*
* @author 芋道源码
*/
+// TODO @timfruit:SysSocialCoreService 改名,方便区分
public interface SysSocialService {
/**
@@ -49,7 +51,7 @@ public interface SysSocialService {
* @param unionId 社交平台的 unionId
* @return 社交用户列表
*/
- List getAllSocialUserList(Integer type, String unionId);
+ List getAllSocialUserList(Integer type, String unionId, UserTypeEnum userTypeEnum);
/**
* 获得指定用户的社交用户列表
@@ -57,7 +59,7 @@ public interface SysSocialService {
* @param userId 用户编号
* @return 社交用户列表
*/
- List getSocialUserList(Long userId);
+ List getSocialUserList(Long userId, UserTypeEnum userTypeEnum);
/**
* 绑定社交用户
@@ -66,7 +68,7 @@ public interface SysSocialService {
* @param type 社交平台的类型 {@link SysSocialTypeEnum}
* @param authUser 授权用户
*/
- void bindSocialUser(Long userId, Integer type, AuthUser authUser);
+ void bindSocialUser(Long userId, Integer type, AuthUser authUser, UserTypeEnum userTypeEnum);
/**
* 取消绑定社交用户
@@ -75,6 +77,7 @@ public interface SysSocialService {
* @param type 社交平台的类型 {@link SysSocialTypeEnum}
* @param unionId 社交平台的 unionId
*/
- void unbindSocialUser(Long userId, Integer type, String unionId);
+ void unbindSocialUser(Long userId, Integer type, String unionId,UserTypeEnum userTypeEnum);
+ // TODO @timfruit:逗号后面要有空格;缺少了 @userTypeEnum 的注释,都补充下哈。
}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/impl/SysSocialServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialServiceImpl.java
similarity index 84%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/impl/SysSocialServiceImpl.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialServiceImpl.java
index 28e33c617e..bde40c3c4c 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/impl/SysSocialServiceImpl.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialServiceImpl.java
@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.adminserver.modules.system.service.social.impl;
+package cn.iocoder.yudao.coreservice.modules.system.service.social.impl;
import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social.SysSocialUserMapper;
-import cn.iocoder.yudao.adminserver.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social.SysSocialUserMapper;
+import cn.iocoder.yudao.coreservice.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
@@ -25,8 +25,8 @@ import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
-import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SOCIAL_AUTH_FAILURE;
-import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SOCIAL_UNBIND_NOT_SELF;
+import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.SOCIAL_AUTH_FAILURE;
+import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.SOCIAL_UNBIND_NOT_SELF;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
@@ -75,25 +75,25 @@ public class SysSocialServiceImpl implements SysSocialService {
}
@Override
- public List getAllSocialUserList(Integer type, String unionId) {
+ public List getAllSocialUserList(Integer type, String unionId,UserTypeEnum userTypeEnum) {
List types = SysSocialTypeEnum.getRelationTypes(type);
- return socialUserMapper.selectListByTypeAndUnionId(UserTypeEnum.ADMIN.getValue(), types, unionId);
+ return socialUserMapper.selectListByTypeAndUnionId(userTypeEnum.getValue(), types, unionId);
}
@Override
- public List getSocialUserList(Long userId) {
- return socialUserMapper.selectListByUserId(UserTypeEnum.ADMIN.getValue(), userId);
+ public List getSocialUserList(Long userId,UserTypeEnum userTypeEnum) {
+ return socialUserMapper.selectListByUserId(userTypeEnum.getValue(), userId);
}
@Override
@Transactional
- public void bindSocialUser(Long userId, Integer type, AuthUser authUser) {
+ public void bindSocialUser(Long userId, Integer type, AuthUser authUser, UserTypeEnum userTypeEnum) {
// 获得 unionId 对应的 SysSocialUserDO 列表
String unionId = getAuthUserUnionId(authUser);
- List socialUsers = this.getAllSocialUserList(type, unionId);
+ List socialUsers = this.getAllSocialUserList(type, unionId, userTypeEnum);
// 逻辑一:如果 userId 之前绑定过该 type 的其它账号,需要进行解绑
- this.unbindOldSocialUser(userId, type, unionId);
+ this.unbindOldSocialUser(userId, type, unionId, userTypeEnum);
// 逻辑二:如果 socialUsers 指定的 userId 改变,需要进行更新
// 例如说,一个微信 unionId 对应了多个社交账号,结果其中有个关联了新的 userId,则其它也要跟着修改
@@ -112,7 +112,7 @@ public class SysSocialServiceImpl implements SysSocialService {
.nickname(authUser.getNickname()).avatar(authUser.getAvatar()).rawUserInfo(toJsonString(authUser.getRawUserInfo()))
.build();
if (socialUser == null) {
- saveSocialUser.setUserId(userId).setUserType(UserTypeEnum.ADMIN.getValue())
+ saveSocialUser.setUserId(userId).setUserType(userTypeEnum.getValue())
.setType(type).setOpenid(authUser.getUuid()).setUnionId(unionId);
socialUserMapper.insert(saveSocialUser);
} else {
@@ -122,9 +122,9 @@ public class SysSocialServiceImpl implements SysSocialService {
}
@Override
- public void unbindSocialUser(Long userId, Integer type, String unionId) {
+ public void unbindSocialUser(Long userId, Integer type, String unionId, UserTypeEnum userTypeEnum) {
// 获得 unionId 对应的所有 SysSocialUserDO 社交用户
- List socialUsers = this.getAllSocialUserList(type, unionId);
+ List socialUsers = this.getAllSocialUserList(type, unionId, userTypeEnum);
if (CollUtil.isEmpty(socialUsers)) {
return;
}
@@ -140,10 +140,10 @@ public class SysSocialServiceImpl implements SysSocialService {
}
@VisibleForTesting
- public void unbindOldSocialUser(Long userId, Integer type, String newUnionId) {
+ public void unbindOldSocialUser(Long userId, Integer type, String newUnionId, UserTypeEnum userTypeEnum) {
List types = SysSocialTypeEnum.getRelationTypes(type);
List oldSocialUsers = socialUserMapper.selectListByTypeAndUserId(
- UserTypeEnum.ADMIN.getValue(), types, userId);
+ userTypeEnum.getValue(), types, userId);
// 如果新老的 unionId 是一致的,说明无需解绑
if (CollUtil.isEmpty(oldSocialUsers) || Objects.equals(newUnionId, oldSocialUsers.get(0).getUnionId())) {
return;
diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml
index 5a0991087f..fba3941500 100644
--- a/yudao-dependencies/pom.xml
+++ b/yudao-dependencies/pom.xml
@@ -410,7 +410,6 @@
yunpian-java-sdk
${yunpian-java-sdk.version}
-
com.aliyun
aliyun-java-sdk-core
@@ -435,7 +434,7 @@
com.xkcoding.justauth
- justauth-spring-boot-starter
+ justauth-spring-boot-starter
${justauth.version}
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/social/SysSocialTypeEnum.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/social/SysSocialTypeEnum.java
deleted file mode 100644
index fe93f39c83..0000000000
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/social/SysSocialTypeEnum.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package cn.iocoder.yudao.userserver.modules.member.enums.social;
-
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.util.ArrayUtil;
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 社交平台的类型枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum SysSocialTypeEnum implements IntArrayValuable {
-
- GITEE(10, "GITEE"), // https://gitee.com/api/v5/oauth_doc#/
- DINGTALK(20, "DINGTALK"), // https://developers.dingtalk.com/document/app/obtain-identity-credentials
- WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"), // https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html
- ;
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSocialTypeEnum::getType).toArray();
-
- public static final List WECHAT_ALL = ListUtil.toList(WECHAT_ENTERPRISE.type);
-
- /**
- * 类型
- */
- private final Integer type;
- /**
- * 类型的标识
- */
- private final String source;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
- public static SysSocialTypeEnum valueOfType(Integer type) {
- return ArrayUtil.firstMatch(o -> o.getType().equals(type), values());
- }
-
- public static List getRelationTypes(Integer type) {
- if (WECHAT_ALL.contains(type)) {
- return WECHAT_ALL;
- }
- return ListUtil.toList(type);
- }
-
-}
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java
index 2b1fd6161a..6d18d53be9 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java
@@ -1,9 +1,12 @@
package cn.iocoder.yudao.userserver.modules.system.controller.auth;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
+import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -13,11 +16,13 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Api(tags = "认证")
@RestController
@@ -30,6 +35,9 @@ public class SysAuthController {
private SysAuthService authService;
@Resource
private SysSmsCodeService smsCodeService;
+ @Resource
+ private SysSocialService socialService;
+
@PostMapping("/login")
@ApiOperation("使用手机 + 密码登录")
@@ -70,42 +78,51 @@ public class SysAuthController {
})
public CommonResult socialAuthRedirect(@RequestParam("type") Integer type,
@RequestParam("redirectUri") String redirectUri) {
-// return CommonResult.success(socialService.getAuthorizeUrl(type, redirectUri));
- return null;
+ return CommonResult.success(socialService.getAuthorizeUrl(type, redirectUri));
+ }
+
+ // TODO @timfruit:这个接口,是要删除的么?
+ @GetMapping("/social-login-get")
+ @ApiOperation("微信公众号授权回调地址,输出social-login2的必要参数用于测试,使用 code 授权码")
+ @ResponseBody
+ @Deprecated
+ public CommonResult socialLoginGet(HttpServletRequest request,String code,String state) {
+ // 返回结果
+ MbrAuthSocialLoginReqVO reqVO = MbrAuthSocialLoginReqVO.builder().state(state).code(code).build();
+ reqVO.setType(12);
+ //输出social-login2的必要参数用于测试
+ System.out.println(JSON.toJSON(reqVO));
+ return success(reqVO);
}
@PostMapping("/social-login")
@ApiOperation("社交登录,使用 code 授权码")
- public CommonResult socialLogin(@RequestBody @Valid MbrAuthSocialLoginReqVO reqVO) {
-// String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent());
-// // 返回结果
-// return success(MbrAuthLoginRespVO.builder().token(token).build());
- return null;
+ public CommonResult socialLogin(@RequestBody @Valid MbrAuthSocialLoginReqVO reqVO) {
+ String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent());
+ return success(SysAuthLoginRespVO.builder().token(token).build());
}
+ // TODO @timfruit:社交登陆时,使用手机验证码来验证哈。这块我当时没设计好,改改,嘿嘿。
+
@PostMapping("/social-login2")
@ApiOperation("社交登录,使用 code 授权码 + 账号密码")
public CommonResult socialLogin2(@RequestBody @Valid MbrAuthSocialLogin2ReqVO reqVO) {
-// String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent());
-// // 返回结果
-// return success(MbrAuthLoginRespVO.builder().token(token).build());
- return null;
+ String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent());
+ return success(SysAuthLoginRespVO.builder().token(token).build());
}
@PostMapping("/social-bind")
@ApiOperation("社交绑定,使用 code 授权码")
public CommonResult socialBind(@RequestBody @Valid MbrAuthSocialBindReqVO reqVO) {
-// authService.socialBind(getLoginUserId(), reqVO);
-// return CommonResult.success(true);
- return null;
+ authService.socialBind(getLoginUserId(), reqVO);
+ return CommonResult.success(true);
}
@DeleteMapping("/social-unbind")
@ApiOperation("取消社交绑定")
public CommonResult socialUnbind(@RequestBody MbrAuthSocialUnbindReqVO reqVO) {
-// socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId());
-// return CommonResult.success(true);
- return null;
+ socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.MEMBER);
+ return CommonResult.success(true);
}
}
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java
index d866411d28..767446b5f0 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java
index 371e7e9b30..584df7ed14 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java
index 5fdd424c1c..cb430231a0 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java
index ea9050a292..75e31701d1 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java
index e5f4ac6785..f24be9cc60 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java
@@ -14,6 +14,7 @@ public interface SysErrorCodeConstants {
ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1005000001, "登录失败,账号被禁用");
ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1005000002, "登录失败"); // 登录失败的兜底,未知原因
ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1005000003, "Token 已经过期");
+ ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1005000004, "未绑定账号,需要进行绑定");
// ========== SMS CODE 模块 1005001000 ==========
ErrorCode USER_SMS_CODE_NOT_FOUND = new ErrorCode(1005001000, "验证码不存在");
@@ -22,4 +23,7 @@ public interface SysErrorCodeConstants {
ErrorCode USER_SMS_CODE_NOT_CORRECT = new ErrorCode(1005001003, "验证码不正确");
ErrorCode USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1005001004, "超过每日短信发送数量");
ErrorCode USER_SMS_CODE_SEND_TOO_FAST = new ErrorCode(1005001005, "短信发送过于频率");
+
+ // ========== 用户模块 1005002000 ==========
+ ErrorCode USER_NOT_EXISTS = new ErrorCode(1005002001, "用户不存在");
}
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java
index b35d1c27a2..628f95c80b 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java
@@ -1,8 +1,7 @@
package cn.iocoder.yudao.userserver.modules.system.service.auth;
import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthSmsLoginReqVO;
+import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
import javax.validation.Valid;
@@ -35,4 +34,33 @@ public interface SysAuthService extends SecurityAuthFrameworkService {
*/
String smsLogin(@Valid SysAuthSmsLoginReqVO reqVO, String userIp, String userAgent);
+
+ /**
+ * 社交登录,使用 code 授权码
+ *
+ * @param reqVO 登录信息
+ * @param userIp 用户 IP
+ * @param userAgent 用户 UA
+ * @return 身份令牌,使用 JWT 方式
+ */
+ String socialLogin(@Valid MbrAuthSocialLoginReqVO reqVO, String userIp, String userAgent);
+
+ /**
+ * 社交登录,使用 code 授权码 + 账号密码
+ *
+ * @param reqVO 登录信息
+ * @param userIp 用户 IP
+ * @param userAgent 用户 UA
+ * @return 身份令牌,使用 JWT 方式
+ */
+ String socialLogin2(@Valid MbrAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent);
+
+ /**
+ * 社交绑定,使用 code 授权码
+ *
+ * @param userId 用户编号
+ * @param reqVO 绑定信息
+ */
+ void socialBind(Long userId, @Valid MbrAuthSocialBindReqVO reqVO);
+
}
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
index 0199c078ef..2394cd03af 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -1,25 +1,28 @@
package cn.iocoder.yudao.userserver.modules.system.service.auth.impl;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthSmsLoginReqVO;
+import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
import cn.iocoder.yudao.userserver.modules.system.convert.auth.SysAuthConvert;
import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum;
import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthUser;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
@@ -33,6 +36,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
+import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -59,6 +63,9 @@ public class SysAuthServiceImpl implements SysAuthService {
private SysLoginLogCoreService loginLogCoreService;
@Resource
private SysUserSessionCoreService userSessionCoreService;
+ @Resource
+ private SysSocialService socialService;
+ private static final UserTypeEnum userTypeEnum = UserTypeEnum.MEMBER;
@Override
public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException {
@@ -99,6 +106,63 @@ public class SysAuthServiceImpl implements SysAuthService {
return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
}
+ @Override
+ public String socialLogin(MbrAuthSocialLoginReqVO reqVO, String userIp, String userAgent) {
+ // 使用 code 授权码,进行登录
+ AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());
+ org.springframework.util.Assert.notNull(authUser, "授权用户不为空");
+
+ // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错
+ String unionId = socialService.getAuthUserUnionId(authUser);
+ List socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, userTypeEnum);
+ if (CollUtil.isEmpty(socialUsers)) {
+ throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
+ }
+
+ // 自动登录
+ MbrUserDO user = userService.getUser(socialUsers.get(0).getUserId());
+ if (user == null) {
+ throw exception(USER_NOT_EXISTS);
+ }
+ this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SOCIAL, SysLoginResultEnum.SUCCESS);
+
+ // 创建 LoginUser 对象
+ LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
+
+ // 绑定社交用户(更新)
+ socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
+
+ // 缓存登录用户到 Redis 中,返回 sessionId 编号
+ return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
+ }
+
+ @Override
+ public String socialLogin2(MbrAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) {
+ // 使用 code 授权码,进行登录
+ AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());
+ org.springframework.util.Assert.notNull(authUser, "授权用户不为空");
+
+ // 使用账号密码,进行登录。
+ LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword());
+// loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表
+
+ // 绑定社交用户(新增)
+ socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
+
+ // 缓存登录用户到 Redis 中,返回 sessionId 编号
+ return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
+ }
+
+ @Override
+ public void socialBind(Long userId, MbrAuthSocialBindReqVO reqVO) {
+ // 使用 code 授权码,进行登录
+ AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());
+ org.springframework.util.Assert.notNull(authUser, "授权用户不为空");
+
+ // 绑定社交用户(新增)
+ socialService.bindSocialUser(userId, reqVO.getType(), authUser, userTypeEnum);
+ }
+
private LoginUser login0(String username, String password) {
final SysLoginLogTypeEnum logTypeEnum = SysLoginLogTypeEnum.LOGIN_USERNAME;
// 用户验证
@@ -207,7 +271,7 @@ public class SysAuthServiceImpl implements SysAuthService {
reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
reqDTO.setTraceId(TracerUtils.getTraceId());
reqDTO.setUserId(userId);
- reqDTO.setUserType(UserTypeEnum.MEMBER.getValue());
+ reqDTO.setUserType(userTypeEnum.getValue());
reqDTO.setUsername(username);
reqDTO.setUserAgent(ServletUtils.getUserAgent());
reqDTO.setUserIp(ServletUtils.getClientIP());
diff --git a/yudao-user-server/src/main/resources/application-dev.yaml b/yudao-user-server/src/main/resources/application-dev.yaml
index 6cbd627f89..858e97739c 100644
--- a/yudao-user-server/src/main/resources/application-dev.yaml
+++ b/yudao-user-server/src/main/resources/application-dev.yaml
@@ -141,3 +141,30 @@ yudao:
pay:
pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
+
+
+justauth:
+ enabled: true
+ type: # TODO @timfruit:GITEE、DINGTALK、WECHAT_ENTERPRISE 这个几个,对于用户端是不需要的哈,可以删除噢
+ GITEE: # Gitee
+ client-id: ee61f0374a4c6c404a8717094caa7a410d76950e45ff60348015830c519ba5c1
+ client-secret: 7c044a5671be3b051414db0cf2cec6ad702dd298d2416ba24ceaf608e6fa26f9
+ ignore-check-redirect-uri: true
+ DINGTALK: # 钉钉
+ client-id: dingvrnreaje3yqvzhxg
+ client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
+ ignore-check-redirect-uri: true
+ WECHAT_ENTERPRISE: # 企业微信
+ client-id: wwd411c69a39ad2e54
+ client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
+ agent-id: 1000004
+ ignore-check-redirect-uri: true
+ WECHAT_MP: # 微信公众平台 - H5 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
+ client-id: wxa5a05b85ac361f96
+ client-secret: 247073c7cebb67f27f0e769195c2a57e
+ ignore-check-redirect-uri: true
+ cache:
+ type: REDIS
+ prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
+ timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
+
diff --git a/yudao-user-server/src/main/resources/application-local.yaml b/yudao-user-server/src/main/resources/application-local.yaml
index ac20815c4b..c39a7cb1b5 100644
--- a/yudao-user-server/src/main/resources/application-local.yaml
+++ b/yudao-user-server/src/main/resources/application-local.yaml
@@ -155,3 +155,28 @@ yudao:
pay:
pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
+
+justauth:
+ enabled: true
+ type:
+ WECHAT_MP: # 微信公众平台 - 移动端 H5 https://www.yuque.com/docs/share/a795bef6-ee8a-494a-8dc4-2ef41927743b?#%20%E3%80%8A%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E6%B5%8B%E8%AF%95%E3%80%8B
+ client-id: wxa5a05b85ac361f96
+ client-secret: 247073c7cebb67f27f0e769195c2a57e
+# client-id: wx5b23ba7a5589ecbb # TODO 芋艿:自己的测试,后续可以删除
+# client-secret: 2a7b3b20c537e52e74afd395eb85f61f
+ ignore-check-redirect-uri: true
+ extend:
+ enum-class: cn.iocoder.yudao.coreservice.modules.system.compent.justauth.AuthExtendSource
+ config:
+ WECHAT_MINI_PROGRAM: # 微信小程序 https://www.yuque.com/docs/share/88e3d30a-6830-45fc-8c25-dae485aef3aa?#%20%E3%80%8A%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%8E%88%E6%9D%83%E7%99%BB%E5%BD%95%E3%80%8B
+ request-class: cn.iocoder.yudao.coreservice.modules.system.compent.justauth.AuthWeChatMiniProgramRequest
+ client-id: wx44d047d87e6284d8
+ client-secret: 21c3b7a8a51ee1b8f5cf875848ed4466
+# client-id: wx63c280fe3248a3e7 # TODO 芋艿:自己的测试,后续可以删除
+# client-secret: 6f270509224a7ae1296bbf1c8cb97aed
+ ignore-check-redirect-uri: true
+ ignore-check-state: true
+ cache:
+ type: REDIS
+ prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
+ timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
diff --git a/yudao-user-server/src/main/resources/static/social-login.html b/yudao-user-server/src/main/resources/static/social-login.html
new file mode 100644
index 0000000000..2570d70841
--- /dev/null
+++ b/yudao-user-server/src/main/resources/static/social-login.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+ 社交登陆测试页
+
+
+
+点击如下按钮,发起登陆的测试
+
+
+
+
+
+
diff --git a/更新日志.md b/更新日志.md
index f66a804cda..cd0c940069 100644
--- a/更新日志.md
+++ b/更新日志.md
@@ -15,6 +15,7 @@ TODO
* 支付
* 用户前台的社交登陆
+* 用户前台的修改手机、修改密码、忘记密码
## [v1.1.0] 2021.10.25