mirror of
https://gitee.com/xiaonuobase/snowy.git
synced 2025-12-26 07:56:43 +08:00
【更新】基座三方登录完善,增加三方登录是否开启配置,完善字典颜色支持
This commit is contained in:
parent
38c1f9b7c1
commit
9a677a2d0a
2
pom.xml
2
pom.xml
@ -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模板引擎 -->
|
||||
|
||||
@ -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')
|
||||
|
||||
|
Before Width: | Height: | Size: 993 KiB After Width: | Height: | Size: 993 KiB |
BIN
snowy-admin-web/src/assets/images/authSource/wechat.png
Normal file
BIN
snowy-admin-web/src/assets/images/authSource/wechat.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 908 B |
@ -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 {
|
||||
|
||||
@ -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>
|
||||
@ -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获取用户信息地址')],
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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 = () => {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
@ -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
|
||||
@ -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))
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置列表
|
||||
*
|
||||
|
||||
@ -51,6 +51,14 @@ public interface DevConfigService extends IService<DevConfig> {
|
||||
*/
|
||||
List<DevConfig> sysBaseList();
|
||||
|
||||
/**
|
||||
* 获取系统三方登录开关配置
|
||||
*
|
||||
* @author xuyuxiang
|
||||
* @date 2022/4/24 20:08
|
||||
*/
|
||||
List<DevConfig> sysThirdAllowFlagList();
|
||||
|
||||
/**
|
||||
* 获取配置列表
|
||||
*
|
||||
|
||||
@ -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<>();
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -153,6 +153,8 @@ public class GlobalConfigure implements WebMvcConfigurer {
|
||||
|
||||
/* 系统基础配置 */
|
||||
"/dev/config/sysBaseList",
|
||||
/* 系统三方登录开关配置 */
|
||||
"/dev/config/sysThirdAllowFlagList",
|
||||
|
||||
/* 系统字典树 */
|
||||
"/dev/dict/tree",
|
||||
|
||||
@ -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 '排序码',
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user