前言

公司的项目是vben admin框架需要集成keycloak,那keycloak大家应该都不陌生了,就是统一认证的一个系统简称IDS。之前用过cas,并重构过cas的前端界面,所以对此也是比较熟悉。

在keycloak官网有个例子,不过他是相对于vue2时候的,现在大家都在用vue3 vite,所以生成vue事例不一样了,vue中我们都知道new Vue()中有个render ,可以在创建的element上添加props属性。可以在vue3中是creatApp(),这个就比较懵了,没有地方写props,那我的keycloak应该写在哪儿呢?

好了,废话不多说,直接上代码

1. 首先下载:yarn add @dsb-norge/vue-keycloak-js
2. 新增文件:src/keyCloak.ts
keyCloak.ts
import type { App } from 'vue';
import keycloak from '@dsb-norge/vue-keycloak-js'; export function setupKeyCloak(app: App<Element>, bootstrap) {
app.use(keycloak, {
init: {
onLoad: 'login-required',
checkLoginIframe: true, //防止登陆后重复刷新
},
config: {
url: 'http://60.215.255.22:8088/auth', // 你的keycloak地址
realm: 'OM',
clientId: 'om-cli',
},
onReady: (keycloak) => {
app.config.globalProperties.$keycloak = keycloak;
console.log(keycloak);
keycloak.loadUserProfile().success((data) => {
console.log(data);
bootstrap(keycloak.token);
});
},
});
}
3. 修改:src/main.ts
main.ts
import 'virtual:windi-base.css';
import 'virtual:windi-components.css';
import '/@/design/index.less';
import 'virtual:windi-utilities.css';
// Register icon sprite
import 'virtual:svg-icons-register';
import App from './App.vue';
import { createApp } from 'vue';
import { initAppConfigStore } from '/@/logics/initAppConfig';
import { setupErrorHandle } from '/@/logics/error-handle';
import { router, setupRouter } from '/@/router';
import { setupRouterGuard } from '/@/router/guard';
import { setupStore } from '/@/store';
import { setupGlobDirectives } from '/@/directives';
import { setupI18n } from '/@/locales/setupI18n';
import { registerGlobComp } from '/@/components/registerGlobComp';
import { setupKeyCloak } from '/@/keyCloak'; // 配置 keycloak
import { useUserStore } from '/@/store/modules/user';
const app = createApp(App);
setupKeyCloak(app, bootstrap); async function bootstrap(token) {
// const app = createApp(App); // Configure store
// 配置 store
setupStore(app); // Initialize internal system configuration
// 初始化内部系统配置
initAppConfigStore(); // Register global components
// 注册全局组件
registerGlobComp(app); // Multilingual configuration
// 多语言配置
// Asynchronous case: language files may be obtained from the server side
// 异步案例:语言文件可能从服务器端获取
await setupI18n(app); // Configure routing
// 配置路由
setupRouter(app); // router-guard
// 路由守卫
setupRouterGuard(router); // Register global directive
// 注册全局指令
setupGlobDirectives(app); // Configure global error handling
// 配置全局错误处理
setupErrorHandle(app); // https://next.router.vuejs.org/api/#isready
// await router.isReady(); // 登陆方法修改
const userStore = useUserStore();
userStore.loginX(token); app.mount('#app');
}
4. 添加loginX:src/store/modules/user.ts
5. 添加logoutX:src/store/modules/user.ts
6. 修改confirmLoginOut:src/store/modules/user.ts
点击查看代码
async loginX(token): Promise<GetUserInfoModel | null> {
try {
this.setToken(token);
return this.afterLoginAction(true);
} catch (error) {
return Promise.reject(error);
}
},
async logoutX(goLogin = false) {
this.setToken(undefined);
this.setUserInfo(null);
console.log('退出成功');
goLogin && router.replace(PageEnum.BASE_HOME);
// goLogin && router.push(PageEnum.BASE_LOGIN);
}, /**
* @description: Confirm before logging out
*/
confirmLoginOut(globalProperties) {
const { createConfirm } = useMessage();
const { t } = useI18n();
createConfirm({
iconType: 'warning',
title: () => h('span', t('sys.app.logoutTip')),
content: () => h('span', t('sys.app.logoutMessage')),
onOk: async () => {
await this.logoutX(true);
await globalProperties.$keycloak.logout();
},
});
},
7. 修改界面的退出登录:src/layouts/default/header/components/user-dropdown/index.vue
点击查看代码
<template>
<Dropdown placement="bottomLeft" :overlayClassName="`${prefixCls}-dropdown-overlay`">
<span :class="[prefixCls, `${prefixCls}--${theme}`]" class="flex">
<img :class="`${prefixCls}__header`" :src="getUserInfo.avatar" />
<span :class="`${prefixCls}__info hidden md:block`">
<span :class="`${prefixCls}__name `" class="truncate">
{{ getUserInfo.realName }}
</span>
</span>
</span> <template #overlay>
<Menu @click="handleMenuClick">
<MenuItem
key="doc"
:text="t('layout.header.dropdownItemDoc')"
icon="ion:document-text-outline"
v-if="getShowDoc"
/>
<MenuDivider v-if="getShowDoc" />
<MenuItem
v-if="getUseLockPage"
key="lock"
:text="t('layout.header.tooltipLock')"
icon="ion:lock-closed-outline"
/>
<MenuItem
key="logout"
:text="t('layout.header.dropdownItemLoginOut')"
icon="ion:power-outline"
/>
</Menu>
</template>
</Dropdown>
<LockAction @register="register" />
</template>
<script lang="ts">
// components
import { Dropdown, Menu } from 'ant-design-vue';
import type { MenuInfo } from 'ant-design-vue/lib/menu/src/interface'; import { defineComponent, computed, getCurrentInstance } from 'vue'; import { DOC_URL } from '/@/settings/siteSetting'; import { useUserStore } from '/@/store/modules/user';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
import { useI18n } from '/@/hooks/web/useI18n';
import { useDesign } from '/@/hooks/web/useDesign';
import { useModal } from '/@/components/Modal'; import headerImg from '/@/assets/images/header.jpg';
import { propTypes } from '/@/utils/propTypes';
import { openWindow } from '/@/utils'; import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; type MenuEvent = 'logout' | 'doc' | 'lock'; export default defineComponent({
name: 'UserDropdown',
components: {
Dropdown,
Menu,
MenuItem: createAsyncComponent(() => import('./DropMenuItem.vue')),
MenuDivider: Menu.Divider,
LockAction: createAsyncComponent(() => import('../lock/LockModal.vue')),
},
props: {
theme: propTypes.oneOf(['dark', 'light']),
},
setup() {
const internalInstance = getCurrentInstance();
const { prefixCls } = useDesign('header-user-dropdown');
const { t } = useI18n();
const { getShowDoc, getUseLockPage } = useHeaderSetting();
const userStore = useUserStore(); const getUserInfo = computed(() => {
const { realName = '', avatar, desc } = userStore.getUserInfo || {};
return { realName, avatar: avatar || headerImg, desc };
}); const [register, { openModal }] = useModal(); function handleLock() {
openModal(true);
} // d
function handleLoginOut() {
userStore.confirmLoginOut(internalInstance?.appContext.config.globalProperties);
} // open doc
function openDoc() {
openWindow(DOC_URL);
} function handleMenuClick(e: MenuInfo) {
switch (e.key as MenuEvent) {
case 'logout':
handleLoginOut();
break;
case 'doc':
openDoc();
break;
case 'lock':
handleLock();
break;
}
} return {
prefixCls,
t,
getUserInfo,
handleMenuClick,
getShowDoc,
register,
getUseLockPage,
};
},
});
</script>
<style lang="less">
@prefix-cls: ~'@{namespace}-header-user-dropdown'; .@{prefix-cls} {
height: @header-height;
padding: 0 0 0 10px;
padding-right: 10px;
overflow: hidden;
font-size: 12px;
cursor: pointer;
align-items: center; img {
width: 24px;
height: 24px;
margin-right: 12px;
} &__header {
border-radius: 50%;
} &__name {
font-size: 14px;
} &--dark {
&:hover {
background-color: @header-dark-bg-hover-color;
}
} &--light {
&:hover {
background-color: @header-light-bg-hover-color;
} .@{prefix-cls}__name {
color: @text-color-base;
} .@{prefix-cls}__desc {
color: @header-light-desc-color;
}
} &-dropdown-overlay {
.ant-dropdown-menu-item {
min-width: 160px;
}
}
}
</style>

vben集成keycloak的更多相关文章

  1. VUE集成keycloak和Layui集成keycloak

    一:KEYCLOAK配置部分: 1,下载keycloak,官网地址:https://www.keycloak.org/downloads.html.下载第一个就行 2,下载完毕之后,打开文件,访问 b ...

  2. jenkins 集成 keycloak 认证

    keycloak 是很不错的sso 工具,当然也有Jenkins 的插件,我们可以使用jenkins 插件,方便用户账户的管理 环境准别 docker-compose version: "3 ...

  3. keycloak集成微信登陆~解决国内微信集成的问题

    之前看了国内写的微信集成keycloak的文章,然后拿来就用了,但我的是jboss部署的keycloak,然后使用他的包之后,会出现类无法找到的问题,之后找了很多资料,多数都是国外的,在今天终于找到了 ...

  4. keycloak学习

    keycloak 是一个针对Web应用和RESTfull Web API 提供SSO(Single Sign On:单点登陆),它是一个开源软件,源码地址是:https://github.com/ke ...

  5. ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码

    概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful service,使用keycloak保护前台页面和后台服务,并且利用open api自动 ...

  6. Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现SSO单点登录

    登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...

  7. 开源认证和访问控制的利器keycloak使用简介

    目录 简介 安装keycloak 创建admin用户 创建realm和普通用户 使用keycloak来保护你的应用程序 安装WildFly client adapter 注册WildFly应用程序 安 ...

  8. aspnetcore 应用 接入Keycloak快速上手指南

    登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...

  9. keycloak~自定义rest接口

    rest资源 对于我们集成keycloak来说,你可能会遇到它没有实现的功能,这时需要对kc进行扩展,资源的扩展是其中一个方面,它需要实现RealmResourceProvider和RealmReso ...

  10. keycloak && docker安装 &&spring boot 集成使用

    1. 基础依赖 a. docker mysql b. dokcer keycloak-mysql   2. 安装     mysql (注意实际使用最好使用本地数据卷) docker run --na ...

随机推荐

  1. 使用OHOS SDK构建libxml2

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://gitlab.gnome.org/GNOME/ ...

  2. Sqlite数据库联合查询及表复制等详述

    外键:一般在两个表之间要建立关联时候,创建一个列创建 为外键(UserInfos-DeptId),它在另一个表必须是主键(DeptInfos-DeptId) 元素约束:主键约束:主要区别内容相同的行, ...

  3. Git 11 设置项目提交人

    前面介绍了可以给 Git 设置全局提交人,这样当前电脑所有项目提交人都会变成设置的值. 但实际开发中有时候需要给不同项目设置不同提交人. 比如工作的项目是一个提交人,自己维护的开源项目又是另一个提交人 ...

  4. HarmonyOS音频开发指导:使用AudioRenderer开发音频播放功能

      AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据,相比AVPlayer而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以 ...

  5. 今天我们来聊一聊Java中的Semaphore

    写在开头 在上几天写<基于AQS手写一个同步器>时,很多同学留言说里面提到的Semaphore,讲得太笼统了,今天趁着周末有空,咱们就一起详细的学习和梳理一把 Semaphore. 什么是 ...

  6. linux 性能自我学习 ———— cpu 切换带来的性能损耗 [二]

    前言 我们知道现在操作系统,都是多进程和多线程,那么会有一个操作系统帮助我们去切换进程和线程,这个是要消耗cpu资源的,那么就来了解一下cpu资源消耗情况. 正文 一般是下面几个场景切换: 进程上下文 ...

  7. IIS applicationHost.config 查找历史

    背景 iis 有时候需要修改配置,一般来说,我们会去修改applicationHost.config配置,当然,很多时候我们都需要去备份一个配置文件,但是可能忘记了,那么是否有补救的方式? 补救方式 ...

  8. 百度unit闲聊机器人

    import json import random import requests # client_id 为官网获取的AK, client_secret 为官网获取的SK client_id = & ...

  9. Java面试题:请谈谈对ThreadLocal的理解?

    ThreadLocal是一种特殊的变量存储机制,它提供了一种方式,可以在每个线程中保存数据,而不会受到其他线程的影响.这种机制在多线程编程中非常有用,因为它允许每个线程拥有自己的数据副本,从而避免了数 ...

  10. C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造

    C++ 构造函数 构造函数是 C++ 中一种特殊的成员函数,当创建类对象时自动调用.它用于初始化对象的状态,例如为属性分配初始值.构造函数与类同名,且没有返回值类型. 构造函数类型 C++ 支持多种类 ...