Browse Source

feat: 加入sso重定向新特性

master
wangxiang 2 years ago
parent
commit
6c8b8c8421
No known key found for this signature in database
GPG Key ID: 1BA7946AB6B232E4
  1. 7
      src/enums/pageEnum.ts
  2. 26
      src/router/guard/permissionGuard.ts
  3. 5
      src/router/guard/stateGuard.ts
  4. 4
      src/utils/index.ts
  5. 63
      src/views/system/ssoLogin/kics/index.vue

7
src/enums/pageEnum.ts

@ -15,3 +15,10 @@ export enum PageEnum { @@ -15,3 +15,10 @@ export enum PageEnum {
// 错误页面路径
ERROR_PAGE = '/exception',
}
export enum SsoLoginPageEnum {
// KICS系统登陆路径
SSO_KICS_LOGIN = '/sso/login/kics',
// KLAB系统登陆路径
SSO_KLAB_LOGIN = '/sso/login/klab',
}

26
src/router/guard/permissionGuard.ts

@ -8,21 +8,35 @@ @@ -8,21 +8,35 @@
import type { Router, RouteRecordRaw } from 'vue-router';
import { usePermissionStoreWithOut } from '/@/store/modules/permission';
import { PageEnum } from '/@/enums/pageEnum';
import { PageEnum, SsoLoginPageEnum } from '/@/enums/pageEnum';
import { useUserStoreWithOut } from '/@/store/modules/user';
import { RootRoute } from '/@/router/routes';
import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
import { setObjToUrlParams } from '/@/utils';
import { AesEncryption } from '/@/utils/cipher';
import { cacheCipher } from '/@/settings/encryptionSetting';
type BasicPageEnum = PageEnum | SsoLoginPageEnum;
const LOGIN_PATH = PageEnum.BASE_LOGIN;
const ROOT_PATH = RootRoute.path;
const ssoPathList: SsoLoginPageEnum[] = Object.values(SsoLoginPageEnum);
/** 设置路由白名单 */
const whitePathList: PageEnum[] = [ LOGIN_PATH ];
const whitePathList: BasicPageEnum[] = [ LOGIN_PATH, ...ssoPathList ];
const encryption = new AesEncryption({ key: cacheCipher.key, iv: cacheCipher.iv });
export function createPermissionGuard(router: Router) {
const userStore = useUserStoreWithOut();
const permissionStore = usePermissionStoreWithOut();
router.beforeEach(async (to, from, next) => {
// 校验token权限信息
const token = userStore.getAccessToken;
// sso重定向转发token进行登陆
if(ssoPathList.includes(to.path as SsoLoginPageEnum) && token) {
return window.location.replace(to.query?.redirect ? setObjToUrlParams(to.query?.redirect as string, {
ticket: encryption.encryptByAES(token)
}) : '/');
}
if (
// 如果指定首页路径数据不为空就代表已经登录直接放过
from.path === ROOT_PATH &&
@ -33,8 +47,6 @@ export function createPermissionGuard(router: Router) { @@ -33,8 +47,6 @@ export function createPermissionGuard(router: Router) {
return next(userStore.getUserInfo.homePath);
}
// 校验token权限信息
const token = userStore.getAccessToken;
// 放过白名单路由
if (whitePathList.includes(to.path as PageEnum)) {
if (to.path === LOGIN_PATH && token) {
@ -45,9 +57,7 @@ export function createPermissionGuard(router: Router) { @@ -45,9 +57,7 @@ export function createPermissionGuard(router: Router) {
next((to.query?.redirect as string) || '/');
return;
}
} catch {
//
}
} catch {}
}
return next();
}

5
src/router/guard/stateGuard.ts

@ -11,13 +11,14 @@ import { useAppStore } from '/@/store/modules/app'; @@ -11,13 +11,14 @@ import { useAppStore } from '/@/store/modules/app';
import { useMultipleTabStore } from '/@/store/modules/multipleTab';
import { useUserStore } from '/@/store/modules/user';
import { usePermissionStore } from '/@/store/modules/permission';
import { PageEnum } from '/@/enums/pageEnum';
import { PageEnum, SsoLoginPageEnum } from '/@/enums/pageEnum';
import { removeTabChangeListener } from '/@/logics/mitt/routeChange';
const ssoPathList: SsoLoginPageEnum[] = Object.values(SsoLoginPageEnum);
export function createStateGuard(router: Router) {
router.afterEach((to) => {
// 只需进入登录页面,清除认证信息即可
if (to.path === PageEnum.BASE_LOGIN) {
if (to.path === PageEnum.BASE_LOGIN || ssoPathList.includes(to.path as SsoLoginPageEnum)) {
const tabStore = useMultipleTabStore();
const userStore = useUserStore();
const appStore = useAppStore();

4
src/utils/index.ts

@ -31,8 +31,8 @@ export function getPopupContainer(node?: HTMLElement): HTMLElement { @@ -31,8 +31,8 @@ export function getPopupContainer(node?: HTMLElement): HTMLElement {
* @returns {string}
* eg:
* let obj = {a: '3', b: '4'}
* setObjToUrlParams('www.baidu.com', obj)
* ==>www.baidu.com?a=3&b=4
* setObjToUrlParams('cn.vuejs.org', obj)
* ==>cn.vuejs.org?a=3&b=4
*/
export function setObjToUrlParams(baseUrl: string, obj: any): string {
let parameters = '';

63
src/views/system/ssoLogin/kics/index.vue

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
<template>
<div :class="prefixCls" class="login-background-img">
<AppLocalePicker v-if="showLocale" class="absolute top-4 right-4 enter-x xl:text-gray-600" :showText="false"/>
11
<!-- <AppLocalePicker v-if="showLocale" class="absolute top-4 right-4 enter-x xl:text-gray-600" :showText="false"/>
<AppDarkModeToggle class="absolute top-3 right-10 enter-x"/>
<div v-if="!getIsMobile" class="aui-logo">
<div>
@ -130,9 +131,9 @@ @@ -130,9 +131,9 @@
<div class="aui-flex">
<a class="aui-linek-code aui-flex-box" @click="codeHandleClick">{{ t('sys.login.qrSignInFormTitle') }}</a>
</div>
<!--<div class="aui-flex">
&lt;!&ndash;<div class="aui-flex">
<a class="aui-linek-code aui-flex-box" @click="registerHandleClick">{{ t('sys.login.registerButton') }}</a>
</div>-->
</div>&ndash;&gt;
</div>
</div>
<a-form>
@ -177,11 +178,11 @@ @@ -177,11 +178,11 @@
</div>
<div v-show="type === 'codeLogin'" :class="`${prefixCls}-form`">
<MiniCodelogin ref="codeRef" @go-back="goBack" @success="handleSuccess"/>
</div>
</div>-->
</div>
</template>
<script lang="ts" setup>
import { getCaptcha } from '/@/api/platform/core/controller/user';
/*/!*import { getCaptcha } from '/@/api/platform/core/controller/user';
import { onMounted, reactive, ref, toRaw, unref } from 'vue';
import defaultCaptchaImg from '/@/assets/images/captcha.jpg';
import { useUserStore } from '/@/store/modules/user';
@ -240,9 +241,9 @@ @@ -240,9 +241,9 @@
const loginLoading = ref<boolean>(false);
const { getIsMobile } = useAppInject();
/**
/!**
* 获取验证码
*/
*!/
async function handleChangeCheckCode() {
formData.inputCode = '';
try {
@ -255,16 +256,16 @@ @@ -255,16 +256,16 @@
}
}
/**
/!**
* 切换登录方式
*/
*!/
function loginClick(type) {
activeIndex.value = type;
}
/**
/!**
* 账号或者手机登录
*/
*!/
async function loginHandleClick() {
if (unref(activeIndex) === 'accountLogin') {
await accountLogin();
@ -310,9 +311,9 @@ @@ -310,9 +311,9 @@
}
}
/**
/!**
* 手机号登录
*/
*!/
async function phoneLogin() {
notification.success({
message: '功能待开发中.',
@ -320,14 +321,14 @@ @@ -320,14 +321,14 @@
});
}
/**
/!**
* 获取手机验证码
*/
*!/
async function getLoginCode() {
/*if (!phoneFormData.mobile) {
/!*if (!phoneFormData.mobile) {
createMessage.warn(t('sys.login.mobilePlaceholder'));
return;
}*/
}*!/
const TIME_COUNT = 60;
if (!unref(timer)) {
timeRuning.value = TIME_COUNT;
@ -344,10 +345,10 @@ @@ -344,10 +345,10 @@
}
}
/**
/!**
* 第三方登录
* @param type
*/
*!/
function onThirdLogin(type) {
notification.success({
message: '功能待开发中.',
@ -355,9 +356,9 @@ @@ -355,9 +356,9 @@
});
}
/**
/!**
* 忘记密码
*/
*!/
function forgetHandelClick() {
type.value = 'forgot';
setTimeout(() => {
@ -365,18 +366,18 @@ @@ -365,18 +366,18 @@
}, 300);
}
/**
/!**
* 返回登录页面
*/
*!/
function goBack() {
activeIndex.value = 'accountLogin';
type.value = 'login';
}
/**
/!**
* 忘记密码/注册账号回调事件
* @param value
*/
*!/
function handleSuccess(value) {
Object.assign(formData, value);
Object.assign(phoneFormData, { mobile: '', smscode: '' });
@ -385,9 +386,9 @@ @@ -385,9 +386,9 @@
handleChangeCheckCode();
}
/**
/!**
* 注册
*/
*!/
function registerHandleClick() {
type.value = 'register';
setTimeout(() => {
@ -395,9 +396,9 @@ @@ -395,9 +396,9 @@
}, 300);
}
/**
/!**
* 二维码登录
*/
*!/
function codeHandleClick() {
type.value = 'codeLogin';
setTimeout(() => {
@ -407,8 +408,8 @@ @@ -407,8 +408,8 @@
onMounted(() => {
//
handleChangeCheckCode();
});
handleC*!/hangeCheckCode();
});*/
</script>
<style lang="less" scoped>

Loading…
Cancel
Save