【更新】基座三方登录完善,增加三方登录是否开启配置,完善字典颜色支持

This commit is contained in:
xuyuxiang 2025-10-27 22:20:41 +08:00
parent 38c1f9b7c1
commit 9a677a2d0a
20 changed files with 203 additions and 174 deletions

View File

@ -319,7 +319,7 @@
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
<version>1.16.6</version>
<version>1.16.7</version>
</dependency>
<!-- beetl模板引擎 -->

View File

@ -46,6 +46,10 @@ export default {
configSysBaseList(data) {
return request('sysBaseList', data, 'get')
},
// 获取系统三方登录开关配置
configSysThirdAllowFlagList(data) {
return request('sysThirdAllowFlagList', data, 'get')
},
// 获取机构树
configOrgTree(data) {
return request('orgTree', data, 'get')

View File

Before

Width:  |  Height:  |  Size: 993 KiB

After

Width:  |  Height:  |  Size: 993 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

View File

@ -2,23 +2,35 @@
<a-divider>{{ $t('login.signInOther') }}</a-divider>
<div class="login-oauth layout-center">
<a-space align="start">
<a @click="getLoginRenderUrl('iam')">
<img style="width: 32px; height: 32px;" src="/src/assets/images/snowy-iam.png" alt="" />
<a v-if="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG" @click="getLoginRenderUrl('IAM')">
<img style="width: 32px; height: 32px;" src="/src/assets/images/authSource/iam.png" alt="" />
</a>
<a @click="getLoginRenderUrl('gitee')">
<GiteeIcon />
</a>
<a @click="getLoginRenderUrl('wechat')">
<wechat-outlined class="bind-icon" :style="{ color: '#1AAD19' }" />
<a v-if="formData.SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG" @click="getLoginRenderUrl('WECHAT')">
<img style="width: 32px; height: 32px;" src="/src/assets/images/authSource/wechat.png" alt="" />
</a>
</a-space>
</div>
</template>
<script setup name="threeLogin">
import configApi from "@/api/dev/configApi";
import thirdApi from '@/api/auth/thirdApi'
import WechatOutlined from "@ant-design/icons-vue/WechatOutlined";
const formData = ref({})
const getConfigSysThirdAllowFlagList = () => {
configApi.configSysThirdAllowFlagList().then((data) => {
data.forEach((item) => {
formData.value[item.configKey] = transferBooleanInValue(item.configValue)
})
})
}
//
const transferBooleanInValue = (value) => {
if (value === 'true' || value === 'false') {
return value === 'true'
} else {
return value
}
}
const getLoginRenderUrl = (platform) => {
const param = {
platform: platform,
@ -28,6 +40,7 @@
window.location.href = data.authorizeUrl
})
}
getConfigSysThirdAllowFlagList();
</script>
<style scoped>
.bind-icon {

View File

@ -1,102 +0,0 @@
<template>
<a-spin :spinning="loadSpinning">
<a-form
ref="formRef"
:model="formData"
:rules="formRules"
layout="vertical"
:label-col="{ ...layout.labelCol, offset: 0 }"
:wrapper-col="{ ...layout.wrapperCol, offset: 0 }"
>
<a-row :gutter="8">
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="GITEE客户端ID" name="SNOWY_THIRD_GITEE_CLIENT_ID">
<a-input v-model:value="formData.SNOWY_THIRD_GITEE_CLIENT_ID" placeholder="请输入GITEE客户端ID" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="GITEE客户端SECRET" name="SNOWY_THIRD_GITEE_CLIENT_SECRET">
<a-input v-model:value="formData.SNOWY_THIRD_GITEE_CLIENT_SECRET" placeholder="请输入GITEE客户端SECRET" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="重定向URL" name="SNOWY_THIRD_GITEE_REDIRECT_URL">
<a-input v-model:value="formData.SNOWY_THIRD_GITEE_REDIRECT_URL" placeholder="请输入重定向URL" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item>
<a-space>
<a-button type="primary" :loading="submitLoading" @click="onSubmit()">保存</a-button>
<a-button @click="() => formRef.resetFields()">重置</a-button>
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</template>
<script setup name="giteeThirdForm">
import { cloneDeep } from 'lodash-es'
import { required } from '@/utils/formRules'
import { message } from 'ant-design-vue'
import configApi from '@/api/dev/configApi'
const formRef = ref()
const formData = ref({})
const submitLoading = ref(false)
const loadSpinning = ref(true)
// ,
const param = {
category: 'THIRD_GITEE'
}
configApi.configList(param).then((data) => {
loadSpinning.value = false
if (data) {
data.forEach((item) => {
formData.value[item.configKey] = item.configValue
})
} else {
message.warning('表单项不存在,请初始化数据库')
}
})
//
const formRules = {
SNOWY_THIRD_GITEE_CLIENT_ID: [required('请输入GITEE客户端ID')],
SNOWY_THIRD_GITEE_CLIENT_SECRET: [required('请输入GITEE客户端SECRET')],
SNOWY_THIRD_GITEE_REDIRECT_URL: [required('请输入重定向URL')]
}
//
const onSubmit = () => {
formRef.value
.validate()
.then(() => {
submitLoading.value = true
let submitParam = cloneDeep(formData.value)
const param = Object.entries(submitParam).map((item) => {
return {
configKey: item[0],
configValue: item[1]
}
})
configApi
.configEditForm(param)
.then(() => {})
.finally(() => {
submitLoading.value = false
})
})
.catch(() => {})
}
const layout = {
labelCol: {
span: 24
},
wrapperCol: {
span: 12
}
}
</script>

View File

@ -10,32 +10,42 @@
>
<a-row :gutter="8">
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="IAM认证地址" name="SNOWY_THIRD_IAM_AUTHORIZE_URL">
<a-form-item label="是否允许IAM登录" name="SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG">
<a-switch
v-model:checked="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG"
checked-children="是"
un-checked-children="否"
placeholder="请选择是否允许IAM登录"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="IAM认证地址" name="SNOWY_THIRD_IAM_AUTHORIZE_URL" v-if="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_IAM_AUTHORIZE_URL" placeholder="请输入IAM认证地址" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="IAM获取token地址" name="SNOWY_THIRD_IAM_ACCESS_TOKEN_URL">
<a-form-item label="IAM获取token地址" name="SNOWY_THIRD_IAM_ACCESS_TOKEN_URL" v-if="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_IAM_ACCESS_TOKEN_URL" placeholder="请输入IAM获取token地址" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="IAM获取用户信息地址" name="SNOWY_THIRD_IAM_USER_INFO_URL">
<a-form-item label="IAM获取用户信息地址" name="SNOWY_THIRD_IAM_USER_INFO_URL" v-if="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_IAM_USER_INFO_URL" placeholder="请输入IAM获取用户信息地址" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="IAM客户端ID" name="SNOWY_THIRD_IAM_CLIENT_ID">
<a-form-item label="IAM客户端ID" name="SNOWY_THIRD_IAM_CLIENT_ID" v-if="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_IAM_CLIENT_ID" placeholder="请输入IAM客户端ID" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="IAM客户端SECRET" name="SNOWY_THIRD_IAM_CLIENT_SECRET">
<a-form-item label="IAM客户端SECRET" name="SNOWY_THIRD_IAM_CLIENT_SECRET" v-if="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_IAM_CLIENT_SECRET" placeholder="请输入IAM客户端SECRET" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="重定向URL" name="SNOWY_THIRD_IAM_REDIRECT_URL">
<a-form-item label="重定向URL" name="SNOWY_THIRD_IAM_REDIRECT_URL" v-if="formData.SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_IAM_REDIRECT_URL" placeholder="请输入重定向URL" />
</a-form-item>
</a-col>
@ -71,15 +81,23 @@
loadSpinning.value = false
if (data) {
data.forEach((item) => {
formData.value[item.configKey] = item.configValue
formData.value[item.configKey] = transferBooleanInValue(item.configValue)
})
} else {
message.warning('表单项不存在,请初始化数据库')
}
})
//
const transferBooleanInValue = (value) => {
if (value === 'true' || value === 'false') {
return value === 'true'
} else {
return value
}
}
//
const formRules = {
SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG: [required('请选择是否允许IAM登录')],
SNOWY_THIRD_IAM_AUTHORIZE_URL: [required('请输入IAM认证地址')],
SNOWY_THIRD_IAM_ACCESS_TOKEN_URL: [required('请输入IAM获取token地址')],
SNOWY_THIRD_IAM_USER_INFO_URL: [required('请输入IAM获取用户信息地址')],

View File

@ -3,9 +3,6 @@
<a-tab-pane key="iamThird" tab="IAM">
<iamThirdForm />
</a-tab-pane>
<a-tab-pane key="giteeThird" tab="GITEE">
<giteeThirdForm />
</a-tab-pane>
<a-tab-pane key="wechatThird" tab="微信">
<wechatThirdForm />
</a-tab-pane>
@ -15,6 +12,5 @@
<script setup name="thirdConfig">
import IamThirdForm from './iamThirdForm.vue'
import WechatThirdForm from './wechatThirdForm.vue'
import GiteeThirdForm from './giteeThirdForm.vue'
const activeKey = ref('iamThird')
</script>

View File

@ -10,18 +10,28 @@
>
<a-row :gutter="8">
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="微信客户端ID" name="SNOWY_THIRD_WECHAT_CLIENT_ID">
<a-input v-model:value="formData.SNOWY_THIRD_WECHAT_CLIENT_ID" placeholder="请输入微信客户端ID" />
<a-form-item label="是否允许微信登录:" name="SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG">
<a-switch
v-model:checked="formData.SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG"
checked-children="是"
un-checked-children="否"
placeholder="请选择是否允许微信登录"
/>
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="微信客户端SECRET" name="SNOWY_THIRD_WECHAT_CLIENT_SECRET">
<a-input v-model:value="formData.SNOWY_THIRD_WECHAT_CLIENT_SECRET" placeholder="请输入微信客户端SECRET" />
<a-form-item label="clientId" name="SNOWY_THIRD_WECHAT_CLIENT_ID" v-if="formData.SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_WECHAT_CLIENT_ID" placeholder="请输入clientId" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="重定向URL" name="SNOWY_THIRD_WECHAT_REDIRECT_URL">
<a-input v-model:value="formData.SNOWY_THIRD_WECHAT_REDIRECT_URL" placeholder="请输入重定向URL" />
<a-form-item label="clientSecret" name="SNOWY_THIRD_WECHAT_CLIENT_SECRET" v-if="formData.SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_WECHAT_CLIENT_SECRET" placeholder="请输入clientSecret" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<a-form-item label="redirectUrl" name="SNOWY_THIRD_WECHAT_REDIRECT_URL" v-if="formData.SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG">
<a-input v-model:value="formData.SNOWY_THIRD_WECHAT_REDIRECT_URL" placeholder="请输入redirectUrl" />
</a-form-item>
</a-col>
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
@ -56,18 +66,26 @@
loadSpinning.value = false
if (data) {
data.forEach((item) => {
formData.value[item.configKey] = item.configValue
formData.value[item.configKey] = transferBooleanInValue(item.configValue)
})
} else {
message.warning('表单项不存在,请初始化数据库')
}
})
//
const transferBooleanInValue = (value) => {
if (value === 'true' || value === 'false') {
return value === 'true'
} else {
return value
}
}
//
const formRules = {
SNOWY_THIRD_WECHAT_CLIENT_ID: [required('请输入微信客户端ID')],
SNOWY_THIRD_WECHAT_CLIENT_SECRET: [required('请输入微信客户端SECRET')],
SNOWY_THIRD_WECHAT_REDIRECT_URL: [required('请输入重定向URL')]
SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG: [required('请选择是否允许微信登录')],
SNOWY_THIRD_WECHAT_CLIENT_ID: [required('请输入clientId')],
SNOWY_THIRD_WECHAT_CLIENT_SECRET: [required('请输入clientSecret')],
SNOWY_THIRD_WECHAT_REDIRECT_URL: [required('请输入redirectUrl')]
}
//
const onSubmit = () => {

View File

@ -10,12 +10,10 @@
<span class="security-list-value">{{ item.value }}</span>
</template>
<template #avatar>
<wechat-outlined v-if="item.type === 'weChat'" class="bind-icon" :style="{ color: '#1AAD19' }" />
<verified-outlined v-if="item.type === 'password'" class="bind-icon" :style="{ color: '#a059e8' }" />
<mail-outlined v-if="item.type === 'email'" class="bind-icon" :style="{ color: '#fcab43' }" />
<mobile-outlined v-if="item.type === 'phone'" class="bind-icon" :style="{ color: '#43a0fc' }" />
<verified-outlined v-if="item.type === 'password'" class="bind-icon" :style="{ color: '#a059e8' }" />
<usb-outlined v-if="item.type === 'otp'" class="bind-icon" :style="{ color: '#1AAD19' }" />
<GiteeIcon v-if="item.type === 'Gitee'" class="bind-icon xn-wd40" />
</template>
</a-list-item-meta>
<template #actions>
@ -78,8 +76,7 @@
type: 'phone',
bindStatus: userInfo && userInfo.value.phone
},
{ title: '绑定微信', description: '未绑定', value: '', type: 'weChat', bindStatus: 0 },
{ title: '绑定Gitee', description: '未绑定', value: '', type: 'Gitee', bindStatus: 0 }
{ title: '动态口令', description: '未绑定动态口令', value: '', type: 'otp', bindStatus: 0 }
])
const bindCommon = (item) => {
let key = item.type

View File

@ -30,14 +30,54 @@ public enum AuthThirdPlatformEnum {
IAM("IAM"),
/**
* GITEE
* 钉钉
*/
GITEE("GITEE"),
DINGTALK("DINGTALK"),
/**
* WECHAT
* 企业微信
*/
WECHAT("WECHAT");
WORKWECHAT("WORKWECHAT"),
/**
* 飞书
*/
FEISHU("FEISHU"),
/**
* WeLink
*/
WELINK("WELINK"),
/**
* 云之家
*/
YUNZHIJIA("YUNZHIJIA"),
/**
* QQ
*/
QQ("QQ"),
/**
* 微信
*/
WECHAT("WECHAT"),
/**
* 微博
*/
WEIBO("WEIBO"),
/**
* 抖音
*/
DOUYIN("DOUYIN"),
/**
* 支付宝
*/
ALIPAY("ALIPAY");
private final String value;
@ -46,7 +86,17 @@ public enum AuthThirdPlatformEnum {
}
public static void validate(String value) {
boolean flag = IAM.getValue().equals(value) || GITEE.getValue().equals(value) || WECHAT.getValue().equals(value);
boolean flag = IAM.getValue().equals(value) ||
DINGTALK.getValue().equals(value) ||
WORKWECHAT.getValue().equals(value) ||
FEISHU.getValue().equals(value) ||
WELINK.getValue().equals(value) ||
YUNZHIJIA.getValue().equals(value) ||
QQ.getValue().equals(value) ||
WECHAT.getValue().equals(value) ||
WEIBO.getValue().equals(value) ||
DOUYIN.getValue().equals(value) ||
ALIPAY.getValue().equals(value);
if(!flag) {
throw new CommonException("不支持的第三方平台:{}", value);
}

View File

@ -10,7 +10,7 @@
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package vip.xiaonuo.auth.modular.third.request;
package vip.xiaonuo.auth.modular.third.request.iam;
import me.zhyd.oauth.config.AuthSource;
import me.zhyd.oauth.request.AuthDefaultRequest;

View File

@ -10,7 +10,7 @@
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package vip.xiaonuo.auth.modular.third.request;
package vip.xiaonuo.auth.modular.third.request.iam;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
@ -38,8 +38,6 @@ import java.util.Map;
@Getter
public class AuthThirdIamRequest extends AuthDefaultRequest {
private final Map<String, String> authSourceOidcBaseJson;
static {
Security.addProvider(new BouncyCastleProvider());
}
@ -48,7 +46,6 @@ public class AuthThirdIamRequest extends AuthDefaultRequest {
super(config, new AuthThirdIamCommonSource(authSourceOidcBaseJson.get("authorizeUrl"),
authSourceOidcBaseJson.get("accessTokenUrl"),
authSourceOidcBaseJson.get("userInfoUrl")));
this.authSourceOidcBaseJson = authSourceOidcBaseJson;
}
@Override

View File

@ -28,9 +28,7 @@ import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthGiteeRequest;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.request.AuthWeChatOpenRequest;
import me.zhyd.oauth.request.*;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -46,7 +44,7 @@ import vip.xiaonuo.auth.modular.third.param.AuthThirdBindAccountParam;
import vip.xiaonuo.auth.modular.third.param.AuthThirdCallbackParam;
import vip.xiaonuo.auth.modular.third.param.AuthThirdRenderParam;
import vip.xiaonuo.auth.modular.third.param.AuthThirdUserPageParam;
import vip.xiaonuo.auth.modular.third.request.AuthThirdIamRequest;
import vip.xiaonuo.auth.modular.third.request.iam.AuthThirdIamRequest;
import vip.xiaonuo.auth.modular.third.result.AuthThirdRenderResult;
import vip.xiaonuo.auth.modular.third.service.AuthThirdService;
import vip.xiaonuo.common.cache.CommonCacheOperator;
@ -69,6 +67,7 @@ public class AuthThirdServiceImpl extends ServiceImpl<AuthThirdMapper, AuthThird
/** 缓存前缀 */
private static final String CONFIG_CACHE_KEY = "auth-third-state:";
private static final String SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG_KEY = "SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG";
private static final String SNOWY_THIRD_IAM_AUTHORIZE_URL_KEY = "SNOWY_THIRD_IAM_AUTHORIZE_URL";
private static final String SNOWY_THIRD_IAM_ACCESS_TOKEN_URL_KEY = "SNOWY_THIRD_IAM_ACCESS_TOKEN_URL";
private static final String SNOWY_THIRD_IAM_USER_INFO_URL_KEY = "SNOWY_THIRD_IAM_USER_INFO_URL";
@ -76,10 +75,8 @@ public class AuthThirdServiceImpl extends ServiceImpl<AuthThirdMapper, AuthThird
private static final String SNOWY_THIRD_IAM_CLIENT_SECRET_KEY = "SNOWY_THIRD_IAM_CLIENT_SECRET";
private static final String SNOWY_THIRD_IAM_REDIRECT_URL_KEY = "SNOWY_THIRD_IAM_REDIRECT_URL";
private static final String SNOWY_THIRD_GITEE_CLIENT_ID_KEY = "SNOWY_THIRD_GITEE_CLIENT_ID";
private static final String SNOWY_THIRD_GITEE_CLIENT_SECRET_KEY = "SNOWY_THIRD_GITEE_CLIENT_SECRET";
private static final String SNOWY_THIRD_GITEE_REDIRECT_URL_KEY = "SNOWY_THIRD_GITEE_REDIRECT_URL";
// 微信
private static final String SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG_KEY = "SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG";
private static final String SNOWY_THIRD_WECHAT_CLIENT_ID_KEY = "SNOWY_THIRD_WECHAT_CLIENT_ID";
private static final String SNOWY_THIRD_WECHAT_CLIENT_SECRET_KEY = "SNOWY_THIRD_WECHAT_CLIENT_SECRET";
private static final String SNOWY_THIRD_WECHAT_REDIRECT_URL_KEY = "SNOWY_THIRD_WECHAT_REDIRECT_URL";
@ -258,8 +255,15 @@ public class AuthThirdServiceImpl extends ServiceImpl<AuthThirdMapper, AuthThird
source = source.toUpperCase();
HttpUtil.setHttp(new HutoolImpl());
AuthThirdPlatformEnum.validate(source);
if (source.equals(AuthThirdPlatformEnum.IAM.getValue())) {
// 山信通登录
if(source.equals(AuthThirdPlatformEnum.IAM.getValue())) {
// 检查是否允许登录
if(!Boolean.parseBoolean(devConfigApi.getValueByKey(SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG_KEY))) {
throw new CommonException("IAM登录已禁用");
}
if(!devConfigApi.getValueByKey(SNOWY_THIRD_IAM_REDIRECT_URL_KEY).startsWith("http")) {
throw new CommonException("重定向地址配置错误");
}
// IAM登录
authRequest = new AuthThirdIamRequest(AuthConfig.builder()
.clientId(devConfigApi.getValueByKey(SNOWY_THIRD_IAM_CLIENT_ID_KEY))
.clientSecret(devConfigApi.getValueByKey(SNOWY_THIRD_IAM_CLIENT_SECRET_KEY))
@ -271,16 +275,14 @@ public class AuthThirdServiceImpl extends ServiceImpl<AuthThirdMapper, AuthThird
"accessTokenUrl", devConfigApi.getValueByKey(SNOWY_THIRD_IAM_ACCESS_TOKEN_URL_KEY),
"userInfoUrl", devConfigApi.getValueByKey(SNOWY_THIRD_IAM_USER_INFO_URL_KEY)));
}
if (source.equals(AuthThirdPlatformEnum.GITEE.getValue())) {
// GITEE登录
authRequest = new AuthGiteeRequest(AuthConfig.builder()
.clientId(devConfigApi.getValueByKey(SNOWY_THIRD_GITEE_CLIENT_ID_KEY))
.clientSecret(devConfigApi.getValueByKey(SNOWY_THIRD_GITEE_CLIENT_SECRET_KEY))
.redirectUri(devConfigApi.getValueByKey(SNOWY_THIRD_GITEE_REDIRECT_URL_KEY))
.ignoreCheckState(true)
.build());
}
if(source.equals(AuthThirdPlatformEnum.WECHAT.getValue())){
// 检查是否允许登录
if(!Boolean.parseBoolean(devConfigApi.getValueByKey(SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG_KEY))) {
throw new CommonException("微信登录已禁用");
}
if(!devConfigApi.getValueByKey(SNOWY_THIRD_WECHAT_REDIRECT_URL_KEY).startsWith("http")) {
throw new CommonException("重定向地址配置错误");
}
// 微信登录
authRequest = new AuthWeChatOpenRequest(AuthConfig.builder()
.clientId(devConfigApi.getValueByKey(SNOWY_THIRD_WECHAT_CLIENT_ID_KEY))

View File

@ -88,6 +88,19 @@ public class DevConfigController {
return CommonResult.data(devConfigService.sysBaseList());
}
/**
* 获取系统三方登录开关配置
*
* @author xuyuxiang
* @date 2022/4/24 20:00
*/
@ApiOperationSupport(order = 2)
@Operation(summary = "获取系统三方登录开关配置")
@GetMapping("/dev/config/sysThirdAllowFlagList")
public CommonResult<List<DevConfig>> sysThirdAllowFlagList() {
return CommonResult.data(devConfigService.sysThirdAllowFlagList());
}
/**
* 获取配置列表
*

View File

@ -51,6 +51,14 @@ public interface DevConfigService extends IService<DevConfig> {
*/
List<DevConfig> sysBaseList();
/**
* 获取系统三方登录开关配置
*
* @author xuyuxiang
* @date 2022/4/24 20:08
*/
List<DevConfig> sysThirdAllowFlagList();
/**
* 获取配置列表
*

View File

@ -135,6 +135,19 @@ public class DevConfigServiceImpl extends ServiceImpl<DevConfigMapper, DevConfig
return this.list(lambdaQueryWrapper);
}
@Override
public List<DevConfig> sysThirdAllowFlagList() {
LambdaQueryWrapper<DevConfig> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 查询部分字段
lambdaQueryWrapper.select(DevConfig::getId, DevConfig::getConfigKey, DevConfig::getConfigValue,
DevConfig::getCategory, DevConfig::getSortCode, DevConfig::getRemark);
// key以SNOWY_THIRD开头
lambdaQueryWrapper.like(DevConfig::getConfigKey, "SNOWY_THIRD");
// key以ALLOW_LOGIN_FLAG结尾
lambdaQueryWrapper.like(DevConfig::getConfigKey, "ALLOW_LOGIN_FLAG");
return this.list(lambdaQueryWrapper);
}
@Override
public List<DevConfig> list(DevConfigListParam devConfigListParam) {
LambdaQueryWrapper<DevConfig> lambdaQueryWrapper = new LambdaQueryWrapper<>();

View File

@ -65,7 +65,7 @@ public class DevDictServiceImpl extends ServiceImpl<DevDictMapper, DevDict> impl
QueryWrapper<DevDict> queryWrapper = new QueryWrapper<DevDict>().checkSqlInjection();
// 查询部分字段
queryWrapper.lambda().select(DevDict::getId, DevDict::getParentId, DevDict::getCategory, DevDict::getDictLabel,
DevDict::getDictValue, DevDict::getSortCode);
DevDict::getDictValue, DevDict::getDictColor, DevDict::getSortCode);
if (ObjectUtil.isNotEmpty(devDictPageParam.getParentId())) {
queryWrapper.lambda().and(q -> q.eq(DevDict::getParentId, devDictPageParam.getParentId())
.or().eq(DevDict::getId, devDictPageParam.getParentId()));
@ -103,7 +103,7 @@ public class DevDictServiceImpl extends ServiceImpl<DevDictMapper, DevDict> impl
LambdaQueryWrapper<DevDict> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 查询部分字段
lambdaQueryWrapper.select(DevDict::getId, DevDict::getParentId, DevDict::getCategory, DevDict::getDictLabel,
DevDict::getDictValue, DevDict::getSortCode);
DevDict::getDictValue, DevDict::getDictColor, DevDict::getSortCode);
lambdaQueryWrapper.orderByAsc(DevDict::getSortCode);
if (ObjectUtil.isNotEmpty(devDictTreeParam.getCategory())) {
lambdaQueryWrapper.eq(DevDict::getCategory, devDictTreeParam.getCategory());

View File

@ -153,6 +153,8 @@ public class GlobalConfigure implements WebMvcConfigurer {
/* 系统基础配置 */
"/dev/config/sysBaseList",
/* 系统三方登录开关配置 */
"/dev/config/sysThirdAllowFlagList",
/* 系统字典树 */
"/dev/dict/tree",

View File

@ -205,9 +205,7 @@ INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967463', 'SNOWY_SYS_DEFAULT_FILE_
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967464', 'SNOWY_SYS_DEFAULT_PASSWORD_FOR_B', '123456', 'PASSWORD_STRATEGY_FOR_B', 'B端默认用户密码', 10, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967465', 'SNOWY_SYS_DEFAULT_DESCRRIPTION', 'Snowy是一款国内首例国产密码算法加密框架采用Vue3.x+AntDesignVue4.x+SpringBoot3.x前后分离技术打造技术框架与密码的结合让前后分离不可分', 'SYS_BASE', '系统描述', 11, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967466', 'SNOWY_SYS_DEFAULT_WORKBENCH_DATA', '{\"shortcut\":[{\"id\":\"1548901111999770526\",\"title\":\"系统首页\",\"icon\":\"home-outlined\",\"path\":\"/index\"}]}', 'SYS_BASE', '系统默认工作台数据', 12, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967558', 'SNOWY_THIRD_GITEE_CLIENT_ID', 'GiteeClientId', 'THIRD_GITEE', 'GiteeClientId', 13, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967559', 'SNOWY_THIRD_GITEE_CLIENT_SECRET', 'GiteeClientSecret', 'THIRD_GITEE', 'GiteeClientSecret', 14, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967560', 'SNOWY_THIRD_GITEE_REDIRECT_URL', 'http://localhost:81/callback?platform=gitee', 'THIRD_GITEE', 'Gitee重定向地址', 15, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967560', 'SNOWY_THIRD_WECHAT_ALLOW_LOGIN_FLAG', 'false', 'THIRD_WECHAT', '是否允许微信登录', 13, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967561', 'SNOWY_THIRD_WECHAT_CLIENT_ID', 'WechatClientId', 'THIRD_WECHAT', 'WechatClientId', 16, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967562', 'SNOWY_THIRD_WECHAT_CLIENT_SECRET', 'WechatClientSecret', 'THIRD_WECHAT', 'WechatClientSecret', 17, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967563', 'SNOWY_THIRD_WECHAT_REDIRECT_URL', 'Wechat重定向地址', 'THIRD_WECHAT', 'Wechat重定向地址', 18, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
@ -347,6 +345,7 @@ INSERT INTO `DEV_CONFIG` VALUES ('1908870094824755296', 'SNOWY_THIRD_IAM_USER_IN
INSERT INTO `DEV_CONFIG` VALUES ('1908870094824755297', 'SNOWY_THIRD_IAM_CLIENT_ID', 'IAM客户端ID', 'THIRD_IAM', 'IAM客户端ID', 180, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1908870094824755298', 'SNOWY_THIRD_IAM_CLIENT_SECRET', 'IAM客户端SECRET', 'THIRD_IAM', 'IAM客户端SECRET', 181, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1908870094824755299', 'SNOWY_THIRD_IAM_REDIRECT_URL', '重定向URL', 'THIRD_IAM', '重定向URL', 182, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `DEV_CONFIG` VALUES ('1908870094824755300', 'SNOWY_THIRD_IAM_ALLOW_LOGIN_FLAG', 'false', 'THIRD_IAM', '是否允许IAM登录', 183, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for DEV_DICT
@ -357,6 +356,7 @@ CREATE TABLE `DEV_DICT` (
`PARENT_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父id',
`DICT_LABEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典文字',
`DICT_VALUE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典值',
`DICT_COLOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典颜色',
`CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码',
`CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类',
`SORT_CODE` int(11) NULL DEFAULT NULL COMMENT '排序码',