权限配置.

This commit is contained in:
许晓东
2023-05-15 21:58:55 +08:00
parent 435a5ca2bc
commit 238507de19
13 changed files with 180 additions and 12 deletions

View File

@@ -50,6 +50,6 @@ cron:
# 权限认证设置设置为true需要先登录才能访问
auth:
enable: true
enable: false
# 登录用户token的过期时间单位小时
expire-hours: 24

View File

@@ -2,4 +2,71 @@
--
-- INSERT INTO t_kafka_user (id, username, password) VALUES
-- (1, 'Jone', 'p1'),
-- (2, 'Jack', 'p2');
-- (2, 'Jack', 'p2');
insert into t_sys_permission(id, name,type,parent_id,permission) values(0,'主页',0,null,'home');
insert into t_sys_permission(id, name,type,parent_id,permission) values(10,'集群',0,null,'cluster');
insert into t_sys_permission(id, name,type,parent_id,permission) values(11,'集群信息',1,10,'cluster');
insert into t_sys_permission(id, name,type,parent_id,permission) values(12,'属性配置',1,11,'cluster:property-config');
insert into t_sys_permission(id, name,type,parent_id,permission) values(13,'日志配置',1,11,'cluster:log-config');
insert into t_sys_permission(id, name,type,parent_id,permission) values(20,'Topic',0,null,'topic');
insert into t_sys_permission(id, name,type,parent_id,permission) values(21,'topic',1,20,'topic');
insert into t_sys_permission(id, name,type,parent_id,permission) values(22,'刷新',1,21,'topic:load');
insert into t_sys_permission(id, name,type,parent_id,permission) values(23,'新增',1,21,'topic:add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(24,'批量删除',1,21,'topic:batch-del');
insert into t_sys_permission(id, name,type,parent_id,permission) values(25,'删除',1,21,'topic:del');
insert into t_sys_permission(id, name,type,parent_id,permission) values(26,'分区详情',1,21,'topic:partition-detail');
insert into t_sys_permission(id, name,type,parent_id,permission) values(27,'首选副本作leader',1,26,'topic:partition-detail:preferred');
insert into t_sys_permission(id, name,type,parent_id,permission) values(28,'增加分区',1,21,'topic:partition-add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(29,'消费详情',1,21,'topic:consumer-detail');
insert into t_sys_permission(id, name,type,parent_id,permission) values(30,'属性配置',1,21,'topic:property-config');
insert into t_sys_permission(id, name,type,parent_id,permission) values(31,'变更副本',1,21,'topic:replication-modify');
insert into t_sys_permission(id, name,type,parent_id,permission) values(32,'发送统计',1,21,'topic:send-count');
insert into t_sys_permission(id, name,type,parent_id,permission) values(33,'限流',1,21,'topic:replication-sync-throttle');
insert into t_sys_permission(id, name,type,parent_id,permission) values(40,'消费组',0,null,'group');
insert into t_sys_permission(id, name,type,parent_id,permission) values(41,'消费组',1,40,'group:load');
insert into t_sys_permission(id, name,type,parent_id,permission) values(42,'新增订阅',1,41,'group:add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(43,'删除',1,41,'group:del');
insert into t_sys_permission(id, name,type,parent_id,permission) values(44,'消费端',1,41,'group:client');
insert into t_sys_permission(id, name,type,parent_id,permission) values(45,'消费详情',1,41,'group:consumer-detail');
insert into t_sys_permission(id, name,type,parent_id,permission) values(46,'最小位点',1,45,'group:consumer-detail:min');
insert into t_sys_permission(id, name,type,parent_id,permission) values(47,'最新位点',1,45,'group:consumer-detail:last');
insert into t_sys_permission(id, name,type,parent_id,permission) values(48,'时间戳',1,45,'group:consumer-detail:timestamp');
insert into t_sys_permission(id, name,type,parent_id,permission) values(49,'重置位点',1,45,'group:consumer-detail:any');
insert into t_sys_permission(id, name,type,parent_id,permission) values(50,'位移分区',1,41,'group:offset-partition');
insert into t_sys_permission(id, name,type,parent_id,permission) values(60,'消息',0,null,'message');
insert into t_sys_permission(id, name,type,parent_id,permission) values(61,'消息',1,60,'message');
insert into t_sys_permission(id, name,type,parent_id,permission) values(62,'根据时间查询',1,61,'message:search-time');
insert into t_sys_permission(id, name,type,parent_id,permission) values(63,'根据偏移查询',1,61,'message:search-offset');
insert into t_sys_permission(id, name,type,parent_id,permission) values(64,'在线发送',1,61,'message:send');
insert into t_sys_permission(id, name,type,parent_id,permission) values(65,'在线删除',1,61,'message:del');
insert into t_sys_permission(id, name,type,parent_id,permission) values(80,'限流',0,null,'quota');
insert into t_sys_permission(id, name,type,parent_id,permission) values(81,'用户',1,80,'quota:user');
insert into t_sys_permission(id, name,type,parent_id,permission) values(82,'新增配置',1,81,'quota:user:add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(83,'客户端ID',1,80,'quota:client');
insert into t_sys_permission(id, name,type,parent_id,permission) values(84,'新增配置',1,83,'quota:client:add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(85,'用户和客户端ID',1,80,'quota:user-client');
insert into t_sys_permission(id, name,type,parent_id,permission) values(86,'新增配置',1,85,'quota:user-client:add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(100,'Acl',0,null,'acl');
insert into t_sys_permission(id, name,type,parent_id,permission) values(101,'资源授权',1,100,'acl:authority');
insert into t_sys_permission(id, name,type,parent_id,permission) values(102,'新增权限',1,101,'acl:authority:add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(120,'用户',0,null,'user-manage');
insert into t_sys_permission(id, name,type,parent_id,permission) values(121,'用户列表',1,120,'user-manage:user');
insert into t_sys_permission(id, name,type,parent_id,permission) values(122,'新增',1,121,'user-manage:user:add');
insert into t_sys_permission(id, name,type,parent_id,permission) values(123,'删除',1,121,'user-manage:user:del');
insert into t_sys_permission(id, name,type,parent_id,permission) values(124,'重置密码',1,121,'user-manage:user:reset-pass');
insert into t_sys_permission(id, name,type,parent_id,permission) values(125,'分配角色',1,121,'user-manage:user:change-role');
insert into t_sys_permission(id, name,type,parent_id,permission) values(126,'角色列表',1,120,'user-manage:role');
insert into t_sys_permission(id, name,type,parent_id,permission) values(127,'保存',1,126,'user-manage:role:save');
insert into t_sys_permission(id, name,type,parent_id,permission) values(128,'删除',1,126,'user-manage:role:del');
insert into t_sys_permission(id, name,type,parent_id,permission) values(129,'权限列表',1,120,'user-manage:permission');
insert into t_sys_permission(id, name,type,parent_id,permission) values(130,'个人设置',1,120,'user-manage:setting');

View File

@@ -19,7 +19,23 @@
><router-link to="/user-page" class="pad-l-r">用户</router-link>
<span>|</span
><router-link to="/op-page" class="pad-l-r">运维</router-link>
<span class="right">集群{{ clusterName }}</span>
<div class="right">
<span>集群{{ clusterName }} </span>
<a-dropdown v-show="showUsername">
<span>
<span> | </span><a-icon type="smile"></a-icon>
<span>{{ username }}</span>
</span>
<a-menu slot="overlay">
<a-menu-item key="1">
<a href="javascript:;" @click="logout">
<!-- <a-icon type="logout"/>-->
<span>退出</span>
</a>
</a-menu-item>
</a-menu>
</a-dropdown>
</div>
</div>
<router-view class="content" />
</div>
@@ -28,9 +44,9 @@
import { KafkaClusterApi, AuthApi } from "@/utils/api";
import request from "@/utils/request";
import { mapMutations, mapState } from "vuex";
import { getClusterInfo } from "@/utils/local-cache";
import {deleteToken, deleteUsername, getClusterInfo, getUsername} from "@/utils/local-cache";
import notification from "ant-design-vue/lib/notification";
import {AUTH, CLUSTER} from "@/store/mutation-types";
import { AUTH, CLUSTER } from "@/store/mutation-types";
export default {
data() {
@@ -46,13 +62,19 @@ export default {
...mapState({
clusterName: (state) => state.clusterInfo.clusterName,
enableSasl: (state) => state.clusterInfo.enableSasl,
showUsername: (state) => state.auth.enable && state.auth.username,
username: (state) => state.auth.username,
}),
},
methods: {
...mapMutations({
switchCluster: CLUSTER.SWITCH,
enableAuth: AUTH.ENABLE,
setUsername: AUTH.SET_USERNAME,
}),
beforeLoadFn() {
this.setUsername(getUsername());
},
intAuthState() {
request({
url: AuthApi.enable.url,
@@ -85,6 +107,14 @@ export default {
this.switchCluster(clusterInfo);
}
},
logout() {
deleteToken();
deleteUsername();
this.$router.push("/login-page");
},
},
mounted() {
this.beforeLoadFn();
},
};
</script>

View File

@@ -0,0 +1,13 @@
import Vue from "vue";
const action = Vue.directive("action", {
inserted: function (el, binding) {
const actionName = binding.arg;
if (actionName != "action") {
(el.parentNode && el.parentNode.removeChild(el)) ||
(el.style.display = "none");
}
},
});
export default action;

View File

@@ -6,6 +6,7 @@ import store from "./store";
import Antd from "ant-design-vue";
import "ant-design-vue/dist/antd.css";
import { VueAxios } from "./utils/request";
import "@/directives/action";
Vue.config.productionTip = false;
Vue.use(Antd);

View File

@@ -1,7 +1,7 @@
import Vue from "vue";
import Vuex from "vuex";
import { CLUSTER, AUTH } from "@/store/mutation-types";
import { setClusterInfo } from "@/utils/local-cache";
import { setClusterInfo, setToken, setUsername } from "@/utils/local-cache";
Vue.use(Vuex);
@@ -14,6 +14,7 @@ export default new Vuex.Store({
},
auth: {
enable: false,
username: "",
},
},
mutations: {
@@ -34,8 +35,12 @@ export default new Vuex.Store({
[AUTH.ENABLE](state, enable) {
state.auth.enable = enable;
},
[AUTH.SET](state, info) {
localStorage.setItem("access_token", info);
[AUTH.SET_TOKEN](state, info) {
setToken(info);
},
[AUTH.SET_USERNAME](state, username) {
setUsername(username);
state.auth.username = username;
},
},
actions: {},

View File

@@ -4,5 +4,6 @@ export const CLUSTER = {
export const AUTH = {
ENABLE: "enable",
SET: "setToken",
SET_TOKEN: "setToken",
SET_USERNAME: "setUsername",
};

View File

@@ -4,4 +4,8 @@ export const ConstantEvent = {
export const Cache = {
clusterInfo: "clusterInfo",
auth: "auth",
token: "access_token",
username: "login_user",
enableAuth: "enable_auth",
};

View File

@@ -8,3 +8,35 @@ export function getClusterInfo() {
const str = localStorage.getItem(Cache.clusterInfo);
return str ? JSON.parse(str) : undefined;
}
// export function setAuth(auth) {
// localStorage.setItem(Cache.auth, JSON.stringify(auth));
// }
export function setToken(token) {
localStorage.setItem(Cache.token, token);
}
export function getToken() {
return localStorage.getItem(Cache.token);
}
export function deleteToken() {
localStorage.removeItem(Cache.token);
}
export function deleteUsername() {
localStorage.removeItem(Cache.username);
}
export function setUsername(username) {
localStorage.setItem(Cache.username, username);
}
export function getUsername() {
return localStorage.getItem(Cache.username);
}
// export function setEnableAuth(enable) {
// localStorage.setItem()
// }

View File

@@ -1,6 +1,6 @@
<template>
<div class="home">
<a-card title="控制台默认配置" class="card-style">
<a-card v-action:action title="控制台默认配置" class="card-style">
<p v-for="(v, k) in config" :key="k">{{ k }}={{ v }}</p>
</a-card>
<p></p>

View File

@@ -65,6 +65,7 @@ export default {
this.loading = false;
if (res.code == 0) {
this.setToken(res.data.token);
this.setUsername(params.username);
this.$router.push("/");
} else {
notification.error({
@@ -77,7 +78,8 @@ export default {
});
},
...mapMutations({
setToken: AUTH.SET,
setToken: AUTH.SET_TOKEN,
setUsername: AUTH.SET_USERNAME,
}),
},
};

View File

@@ -46,7 +46,7 @@
</a-form>
</div>
<div class="operation-row-button">
<a-button type="primary" @click="openCreateTopicDialog"
<a-button type="primary" @click="openCreateTopicDialog" v-action:action
>新增</a-button
>
<a-popconfirm
@@ -60,6 +60,7 @@
class="btn-left"
:disabled="!hasSelected"
:loading="loading"
v-action:action
>
批量删除
</a-button>

View File

@@ -204,6 +204,18 @@ export default {
.filter((id) => idSet.has(id));
btn.selected = selected || [];
btn.selectAll = btn.selected.length == btn.children.length;
} else {
const self = Object.assign({}, btn);
self.name = btn.name;
self.label = btn.name;
self.value = btn.id;
const btnArr = [self];
btn.children = btnArr;
const selected = btn.children
.map((bc) => bc.id)
.filter((id) => idSet.has(id));
btn.selected = selected || [];
btn.selectAll = btn.selected.length == btn.children.length;
}
});
menu.children = arr;