Merge pull request #2439 from dataease/pr@dev@feat_fit_xpack_cas

feat: 适配xpack-cas单点登录
This commit is contained in:
fit2cloud-chenyw
2022-06-16 18:42:06 +08:00
committed by GitHub
28 changed files with 570 additions and 65 deletions

View File

@@ -79,8 +79,10 @@
"@vue/cli-plugin-babel": "3.6.0",
"@vue/cli-plugin-eslint": "^3.9.1",
"@vue/cli-service": "^3.3.1",
"add-asset-html-webpack-plugin": "^3.1.3",
"babel-eslint": "10.0.1",
"chalk": "2.4.2",
"clean-webpack-plugin": "^1.0.1",
"connect": "3.6.6",
"copy-webpack-plugin": "^4.6.0",
"eslint": "5.15.3",
@@ -95,11 +97,9 @@
"script-ext-html-webpack-plugin": "2.1.3",
"script-loader": "^0.7.2",
"serve-static": "^1.13.2",
"add-asset-html-webpack-plugin": "^3.1.3",
"clean-webpack-plugin": "^1.0.1",
"vue-template-compiler": "2.6.10",
"webpack-cli": "^3.2.3",
"vuetify": "^2.6.6"
"vuetify": "^2.6.6",
"webpack-cli": "^3.2.3"
},
"engines": {
"node": ">=8.9",

View File

@@ -22,6 +22,13 @@ export function logout() {
})
}
export function deLogout() {
return request({
url: '/api/auth/deLogout',
method: 'post'
})
}
export function needModifyPwd() {
return request({
url: '/api/auth/useInitPwd',
@@ -79,6 +86,13 @@ export function oidcStatus() {
})
}
export function casStatus() {
return request({
url: '/api/auth/isOpenCas',
method: 'post'
})
}
export function pluginLoaded() {
return request({
url: '/api/auth/isPluginLoaded',

View File

@@ -471,7 +471,8 @@ export default {
display: 'Display Setting',
ldap: 'LDAP Setting',
oidc: 'OIDC Setting',
theme: 'Theme Setting'
theme: 'Theme Setting',
cas: 'CAS Setting'
},
license: {
i18n_no_license_record: 'No License Record',
@@ -657,7 +658,8 @@ export default {
test_recipients: 'Test recipients',
tip: 'Tip: use as test mail recipient only',
engine_mode_setting: 'Engine Setting',
kettle_setting: 'Kettle Setting'
kettle_setting: 'Kettle Setting',
cas_selected_warn: 'Selecting CAS will cause you to login again'
},
chart: {
view_reset: 'View Reset',

View File

@@ -471,7 +471,8 @@ export default {
display: '顯示設置',
ldap: 'LDAP設置',
oidc: 'OIDC設置',
theme: '主題設置'
theme: '主題設置',
cas: 'CAS設置'
},
license: {
i18n_no_license_record: '沒有 License 記錄',
@@ -645,7 +646,7 @@ export default {
login_type: '默認登錄方式',
empty_front: '為空則默認取值10秒',
empty_msg: '為空則默認取值30天',
front_error: '請填寫0-300正整數', //修改了提示信息
front_error: '請填寫0-300正整數', // 修改了提示信息
msg_error: '請填寫1-365正整數',
SMTP_port: 'SMTP端口',
SMTP_account: 'SMTP賬戶',
@@ -659,7 +660,8 @@ export default {
test_recipients: '測試收件人',
tip: '提示:僅用來作爲測試郵件收件人',
engine_mode_setting: '引擎設置',
kettle_setting: 'Kettle 設置'
kettle_setting: 'Kettle 設置',
cas_selected_warn: '選擇CAS方式保存後會註銷當前回話重新登錄'
},
chart: {
view_reset: '视图重置',

View File

@@ -472,7 +472,8 @@ export default {
display: '显示设置',
ldap: 'LDAP设置',
oidc: 'OIDC设置',
theme: '主题设置'
theme: '主题设置',
cas: 'CAS设置'
},
license: {
i18n_no_license_record: '没有 License 记录',
@@ -660,7 +661,8 @@ export default {
test_recipients: '测试收件人',
tip: '提示:仅用来作为测试邮件收件人',
engine_mode_setting: '引擎设置',
kettle_setting: 'Kettle 设置'
kettle_setting: 'Kettle 设置',
cas_selected_warn: '选择CAS方式保存后会注销当前回话重新登录'
},
chart: {
view_reset: '视图重置',

View File

@@ -197,6 +197,9 @@ export default {
bus.$on('set-top-menu-active-info', this.setTopMenuActiveInfo)
bus.$on('set-top-text-info', this.setTopTextInfo)
bus.$on('set-top-text-active-info', this.setTopTextActiveInfo)
bus.$on('sys-logout', param => {
this.logout(param)
})
this.showTips && this.$nextTick(() => {
const drop = this.$refs['my-drop']
drop && drop.show && drop.show()
@@ -300,9 +303,13 @@ export default {
}
return route.children.filter(kid => !kid.hidden).length
},
async logout() {
await this.$store.dispatch('user/logout')
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
async logout(param) {
const result = await this.$store.dispatch('user/logout', param)
if (result !== 'success' && result !== 'fail') {
window.location.href = result
} else {
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
}
},
loadUiInfo() {
this.$store.dispatch('user/getUI').then(() => {

View File

@@ -6,6 +6,7 @@ module.exports = {
/* for sso */
IdTokenKey: 'IdToken',
AccessTokenKey: 'AccessToken',
CASSESSION: 'JSESSIONID',
/**
* @type {boolean} true | false

View File

@@ -1,4 +1,4 @@
import { login, logout, getInfo, getUIinfo, languageApi } from '@/api/user'
import { login, logout, deLogout, getInfo, getUIinfo, languageApi } from '@/api/user'
import { getToken, setToken, removeToken, setSysUI } from '@/utils/auth'
import { resetRouter } from '@/router'
import { format } from '@/utils/formatUi'
@@ -136,13 +136,15 @@ const actions = {
},
// user logout
logout({ commit, state }) {
logout({ commit, state }, param) {
const method = param && param.casEnable ? deLogout : logout
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
method(state.token).then(res => {
debugger
removeToken() // must remove token first
resetRouter()
commit('RESET_STATE')
resolve()
resolve(res.data)
}).catch(error => {
reject(error)
})

View File

@@ -7,6 +7,8 @@ const IdTokenKey = Config.IdTokenKey
const AccessTokenKey = Config.AccessTokenKey
const casSessionKey = Config.CASSESSION
const linkTokenKey = Config.LinkTokenKey
export function getIdToken() {
@@ -22,6 +24,7 @@ export function setToken(token) {
}
export function removeToken() {
Cookies.remove(casSessionKey)
Cookies.remove(IdTokenKey)
Cookies.remove(AccessTokenKey)
return Cookies.remove(TokenKey)

View File

@@ -38,6 +38,7 @@
<el-radio :label="0" size="mini">{{ $t('login.default_login') }}</el-radio>
<el-radio v-if="loginTypes.includes(1)" :label="1" size="mini">LDAP</el-radio>
<el-radio v-if="loginTypes.includes(2)" :label="2" size="mini">OIDC</el-radio>
<el-radio v-if="loginTypes.includes(3)" :label="3" size="mini">CAS</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
@@ -67,8 +68,8 @@
<script>
import { basicInfo, updateInfo } from '@/api/system/basic'
import { ldapStatus, oidcStatus } from '@/api/user'
import { ldapStatus, oidcStatus, casStatus } from '@/api/user'
import bus from '@/utils/bus'
export default {
name: 'EmailSetting',
data() {
@@ -86,7 +87,7 @@ export default {
rules: {
frontTimeOut: [
{
pattern: '^([0-9]|\\b[1-9]\\d\\b|\\b[1-2]\\d\\d\\b|\\b300\\b)$', //修改了正则表达式让其正确匹配0-300的数值
pattern: '^([0-9]|\\b[1-9]\\d\\b|\\b[1-2]\\d\\d\\b|\\b300\\b)$', // 修改了正则表达式让其正确匹配0-300的数值
message: this.$t('system_parameter_setting.front_error'),
trigger: 'blur'
}
@@ -98,7 +99,8 @@ export default {
trigger: 'blur'
}
]
}
},
originLoginType: null
}
},
beforeCreate() {
@@ -113,6 +115,12 @@ export default {
this.loginTypes.push(2)
}
})
casStatus().then(res => {
if (res.success && res.data) {
this.loginTypes.push(3)
}
})
},
created() {
this.query()
@@ -126,6 +134,9 @@ export default {
if (this.formInline && !this.formInline.loginType) {
this.formInline.loginType = 0
}
if (!this.originLoginType) {
this.originLoginType = this.formInline.loginType
}
this.$nextTick(() => {
this.$refs.formInline.clearValidate()
@@ -150,24 +161,45 @@ export default {
this.$refs[formInline].validate(valid => {
if (valid) {
updateInfo(param).then(response => {
const flag = response.success
if (flag) {
this.$success(this.$t('commons.save_success'))
this.showEdit = true
this.showCancel = false
this.showSave = false
this.show = true
window.location.reload()
} else {
this.$message.error(this.$t('commons.save_failed'))
}
})
const needWarn = this.formInline.loginType === 3 && this.originLoginType !== 3
if (needWarn) {
this.$confirm(this.$t('system_parameter_setting.cas_selected_warn'), '', {
confirmButtonText: this.$t('commons.confirm'),
cancelButtonText: this.$t('commons.cancel'),
type: 'warning'
}).then(() => {
this.saveHandler(param)
}).catch(() => {
// this.$info(this.$t('commons.delete_cancel'))
})
return
}
this.saveHandler(param)
} else {
// this.result = false
}
})
},
saveHandler(param) {
updateInfo(param).then(response => {
const flag = response.success
if (flag) {
if (response.data && response.data.needLogout) {
const casEnable = response.data.casEnable
bus.$emit('sys-logout', { casEnable })
return
}
this.$success(this.$t('commons.save_success'))
this.showEdit = true
this.showCancel = false
this.showSave = false
this.show = true
window.location.reload()
} else {
this.$message.error(this.$t('commons.save_failed'))
}
})
},
cancel() {
this.showEdit = true
this.showCancel = false

View File

@@ -3,7 +3,7 @@
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane :lazy="true" :label="$t('system_parameter_setting.basic_setting')" name="zero">
<basic-setting />
<basic-setting v-if="activeName === 'zero'" />
</el-tab-pane>
<el-tab-pane :lazy="true" :label="$t('system_parameter_setting.mailbox_service_settings')" name="first">
@@ -34,10 +34,14 @@
<cluster-mode />
</el-tab-pane>
<el-tab-pane v-if="engineMode==='cluster'" :lazy="true" :label="$t('system_parameter_setting.kettle_setting')" name="eight">
<el-tab-pane v-if="engineMode==='cluster'" :lazy="true" :label="$t('system_parameter_setting.kettle_setting')" name="eight">
<kettle-setting />
</el-tab-pane>
<el-tab-pane v-if="isPluginLoaded" :lazy="true" :label="$t('sysParams.cas')" name="nine">
<plugin-com v-if="isPluginLoaded" ref="CasSetting" component-name="CasSetting" />
</el-tab-pane>
</el-tabs>
</layout-content>
</template>
@@ -53,7 +57,7 @@ import { pluginLoaded } from '@/api/user'
import { engineMode } from '@/api/system/engine'
export default {
components: { BasicSetting, EmailSetting, LayoutContent, PluginCom, SimpleMode, ClusterMode, KettleSetting},
components: { BasicSetting, EmailSetting, LayoutContent, PluginCom, SimpleMode, ClusterMode, KettleSetting },
data() {
return {
activeName: 'zero',
@@ -68,6 +72,9 @@ export default {
engineMode().then(res => {
this.engineMode = res.data
})
},
created() {
},
methods: {
handleClick(tab, event) {