delete user and authority info
This commit is contained in:
@@ -37,4 +37,10 @@ public class AclUserController {
|
|||||||
public Object deleteUser(@RequestBody AclUser user) {
|
public Object deleteUser(@RequestBody AclUser user) {
|
||||||
return aclService.deleteUser(user.getUsername());
|
return aclService.deleteUser(user.getUsername());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@DeleteMapping("/auth")
|
||||||
|
public Object deleteUserAndAuth(@RequestBody AclUser user) {
|
||||||
|
return aclService.deleteUserAndAuth(user.getUsername());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ public interface AclService {
|
|||||||
|
|
||||||
ResponseData deleteUser(String name);
|
ResponseData deleteUser(String name);
|
||||||
|
|
||||||
|
ResponseData deleteUserAndAuth(String name);
|
||||||
|
|
||||||
ResponseData getAclList();
|
ResponseData getAclList();
|
||||||
|
|
||||||
ResponseData getAclList(AclEntry entry);
|
ResponseData getAclList(AclEntry entry);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import org.apache.kafka.common.acl.AclBinding;
|
|||||||
import org.springframework.beans.factory.SmartInitializingSingleton;
|
import org.springframework.beans.factory.SmartInitializingSingleton;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import scala.Tuple2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kafka-console-ui.
|
* kafka-console-ui.
|
||||||
@@ -57,7 +58,24 @@ public class AclServiceImpl implements AclService, SmartInitializingSingleton {
|
|||||||
|
|
||||||
@Override public ResponseData deleteUser(String name) {
|
@Override public ResponseData deleteUser(String name) {
|
||||||
log.info("delete user: {}", name);
|
log.info("delete user: {}", name);
|
||||||
return configConsole.deleteUser(name) ? ResponseData.create().success() : ResponseData.create().failed();
|
Tuple2<Object, String> tuple2 = configConsole.deleteUser(name);
|
||||||
|
return (boolean)tuple2._1() ? ResponseData.create().success() : ResponseData.create().failed(tuple2._2());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public ResponseData deleteUserAndAuth(String name) {
|
||||||
|
log.info("delete user and authority: {}", name);
|
||||||
|
AclEntry entry = new AclEntry();
|
||||||
|
entry.setPrincipal(name);
|
||||||
|
if ( aclConsole.deleteUserAcl(entry)) {
|
||||||
|
Tuple2<Object, String> delUR = configConsole.deleteUser(name);
|
||||||
|
if (!((boolean)delUR._1())) {
|
||||||
|
return ResponseData.create().failed("用户权限删除成功,但是用户信息删除失败: " + delUR._2());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return ResponseData.create().failed("删除用户权限失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResponseData.create().success();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public ResponseData getAclList() {
|
@Override public ResponseData getAclList() {
|
||||||
|
|||||||
24
src/main/resources/logback-test.xml
Normal file
24
src/main/resources/logback-test.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<configuration debug="false">
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<layout class="ch.qos.logback.classic.PatternLayout">
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<logger name="org.apache.kafka.clients.consumer" level="warn" additivity="false">
|
||||||
|
<appender-ref ref="STDOUT"/>
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger name="org.apache.kafka.clients.admin.AdminClientConfig" level="warn" additivity="false">
|
||||||
|
<appender-ref ref="STDOUT"/>
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger name="ch.qos.logback" level="error" additivity="false">
|
||||||
|
<appender-ref ref="STDOUT"/>
|
||||||
|
</logger>
|
||||||
|
</configuration>
|
||||||
@@ -123,8 +123,8 @@ class KafkaAclConsole(config: KafkaConfig) extends KafkaConsole(config: KafkaCon
|
|||||||
|
|
||||||
def deleteUserAcl(entry: AclEntry): Boolean = {
|
def deleteUserAcl(entry: AclEntry): Boolean = {
|
||||||
val filter: AclBindingFilter = entry.toAclBindingFilter
|
val filter: AclBindingFilter = entry.toAclBindingFilter
|
||||||
val delFilter = new AclBindingFilter(new ResourcePatternFilter(ResourceType.ANY, ResourcePattern.WILDCARD_RESOURCE, filter.patternFilter().patternType()),
|
val delFilter = new AclBindingFilter(new ResourcePatternFilter(ResourceType.ANY, null, filter.patternFilter().patternType()),
|
||||||
new AccessControlEntryFilter(filter.entryFilter().principal(), filter.entryFilter().host(), AclOperation.ANY, AclPermissionType.ANY))
|
new AccessControlEntryFilter(filter.entryFilter().principal(), null, AclOperation.ANY, AclPermissionType.ANY))
|
||||||
|
|
||||||
deleteAcl(Collections.singleton(delFilter))
|
deleteAcl(Collections.singleton(delFilter))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,18 +74,18 @@ class KafkaConfigConsole(config: KafkaConfig) extends KafkaConsole(config: Kafka
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def deleteUser(name: String): Boolean = {
|
def deleteUser(name: String): (Boolean, String) = {
|
||||||
withAdminClient(adminClient => {
|
withAdminClient(adminClient => {
|
||||||
try {
|
try {
|
||||||
adminClient.alterUserScramCredentials(util.Arrays.asList(
|
adminClient.alterUserScramCredentials(util.Arrays.asList(
|
||||||
new UserScramCredentialDeletion(name, ScramMechanism.fromMechanismName(config.getSaslMechanism))))
|
new UserScramCredentialDeletion(name, ScramMechanism.fromMechanismName(config.getSaslMechanism))))
|
||||||
.all().get(3000, TimeUnit.MILLISECONDS)
|
.all().get(3000, TimeUnit.MILLISECONDS)
|
||||||
true
|
(true, null)
|
||||||
} catch {
|
} catch {
|
||||||
case ex: Exception => log.error("deleteUser error", ex)
|
case ex: Exception => log.error("deleteUser error", ex)
|
||||||
false
|
(false, ex.getMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
}).asInstanceOf[Boolean]
|
}).asInstanceOf[(Boolean, String)]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
ui/src/utils/api.js
Normal file
14
ui/src/utils/api.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
export const KafkaAclApi = {
|
||||||
|
addKafkaUser: {
|
||||||
|
url: "/user",
|
||||||
|
method: "post",
|
||||||
|
},
|
||||||
|
deleteKafkaUser: {
|
||||||
|
url: "/user/auth",
|
||||||
|
method: "delete",
|
||||||
|
},
|
||||||
|
getAclList: {
|
||||||
|
url: "/acl/list",
|
||||||
|
method: "post",
|
||||||
|
},
|
||||||
|
};
|
||||||
3
ui/src/utils/constants.js
Normal file
3
ui/src/utils/constants.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export const ConstantEvent = {
|
||||||
|
updateUserDialogData: "updateUserDialogData",
|
||||||
|
};
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
</a-col>
|
</a-col>
|
||||||
|
|
||||||
<a-col :span="24" :style="{ textAlign: 'right' }">
|
<a-col :span="24" :style="{ textAlign: 'right' }">
|
||||||
<a-button type="primary" html-type="submit"> 搜索 </a-button>
|
<a-button type="primary" html-type="submit"> 搜索</a-button>
|
||||||
<a-button :style="{ marginLeft: '8px' }" @click="handleReset">
|
<a-button :style="{ marginLeft: '8px' }" @click="handleReset">
|
||||||
重置
|
重置
|
||||||
</a-button>
|
</a-button>
|
||||||
@@ -49,23 +49,29 @@
|
|||||||
<a-button type="primary" @click="updateUser">新增/更新用户</a-button>
|
<a-button type="primary" @click="updateUser">新增/更新用户</a-button>
|
||||||
<UpdateUser
|
<UpdateUser
|
||||||
:visible="showUpdateUser"
|
:visible="showUpdateUser"
|
||||||
@updateDialogData="closeUpdateUserDialog"
|
@updateUserDialogData="closeUpdateUserDialog"
|
||||||
></UpdateUser>
|
></UpdateUser>
|
||||||
</div>
|
</div>
|
||||||
<a-table :columns="columns" :data-source="data" bordered>
|
<a-table :columns="columns" :data-source="data" bordered>
|
||||||
<a slot="operation" slot-scope="{}">
|
<a slot="operation" slot-scope="record">
|
||||||
<a slot="operation" href="javascript:;" class="operation-btn" @click="onDeleteUser">删除</a>
|
<a-popconfirm
|
||||||
<a slot="operation" href="javascript:;" class="operation-btn">授予生产权限</a>
|
:title="'删除用户: ' + record.username + '及相关权限?'"
|
||||||
<a slot="operation" href="javascript:;" class="operation-btn">收回生产权限</a>
|
ok-text="确认"
|
||||||
<a slot="operation" href="javascript:;" class="operation-btn">授予消费权限</a>
|
cancel-text="取消"
|
||||||
<a slot="operation" href="javascript:;" class="operation-btn">收回消费权限</a>
|
@confirm="onDeleteUser(record)"
|
||||||
<a slot="operation" href="javascript:;" class="operation-btn">增加权限</a>
|
>
|
||||||
<!-- <a-button class="operation-btn">删除</a-button>-->
|
<a href="javascript:;" class="operation-btn">删除</a>
|
||||||
<!-- <a-button class="operation-btn">授予生产权限</a-button>-->
|
</a-popconfirm>
|
||||||
<!-- <a-button class="operation-btn">收回生产权限</a-button>-->
|
<a
|
||||||
<!-- <a-button class="operation-btn">授予消费权限</a-button>-->
|
href="javascript:;"
|
||||||
<!-- <a-button class="operation-btn">收回消费权限</a-button>-->
|
class="operation-btn"
|
||||||
<!-- <a-button class="operation-btn">增加权限</a-button>-->
|
@click="onAddProducerAuth(record)"
|
||||||
|
>授予生产权限</a
|
||||||
|
>
|
||||||
|
<a href="javascript:;" class="operation-btn">收回生产权限</a>
|
||||||
|
<a href="javascript:;" class="operation-btn">授予消费权限</a>
|
||||||
|
<a href="javascript:;" class="operation-btn">收回消费权限</a>
|
||||||
|
<a href="javascript:;" class="operation-btn">增加权限</a>
|
||||||
</a>
|
</a>
|
||||||
<!-- <a-table-->
|
<!-- <a-table-->
|
||||||
<!-- slot="expandedRowRender"-->
|
<!-- slot="expandedRowRender"-->
|
||||||
@@ -100,6 +106,7 @@
|
|||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
import notification from "ant-design-vue/es/notification";
|
import notification from "ant-design-vue/es/notification";
|
||||||
import UpdateUser from "@/views/acl/UpdateUser";
|
import UpdateUser from "@/views/acl/UpdateUser";
|
||||||
|
import { KafkaAclApi } from "@/utils/api";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "Acl",
|
name: "Acl",
|
||||||
@@ -113,6 +120,7 @@ export default {
|
|||||||
innerData,
|
innerData,
|
||||||
form: this.$form.createForm(this, { name: "advanced_search" }),
|
form: this.$form.createForm(this, { name: "advanced_search" }),
|
||||||
showUpdateUser: false,
|
showUpdateUser: false,
|
||||||
|
deleteUserConfirm: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -149,25 +157,38 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onDeleteUser(row) {
|
onDeleteUser(row) {
|
||||||
console.log("delete user:", row)
|
request({
|
||||||
}
|
url: KafkaAclApi.deleteKafkaUser.url,
|
||||||
|
method: KafkaAclApi.deleteKafkaUser.method,
|
||||||
|
data: { username: row.username },
|
||||||
|
}).then((res) => {
|
||||||
|
getAclList(this.data, this.queryParam);
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(res.msg);
|
||||||
|
} else {
|
||||||
|
this.$message.error(res.msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onAddProducerAuth(row) {
|
||||||
|
const rowData = {};
|
||||||
|
Object.assign(rowData, row);
|
||||||
|
console.log("onAddProducerAuth user:", rowData);
|
||||||
|
},
|
||||||
|
cancel(e) {
|
||||||
|
console.log(e);
|
||||||
|
this.$message.error("Click on No");
|
||||||
|
},
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
getAclList(this.data, this.queryParam);
|
getAclList(this.data, this.queryParam);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const api = {
|
|
||||||
getAclList: {
|
|
||||||
url: "/acl/list",
|
|
||||||
method: "post",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
function getAclList(data, requestParameters) {
|
function getAclList(data, requestParameters) {
|
||||||
request({
|
request({
|
||||||
url: api.getAclList.url,
|
url: KafkaAclApi.getAclList.url,
|
||||||
method: api.getAclList.method,
|
method: KafkaAclApi.getAclList.method,
|
||||||
data: requestParameters,
|
data: requestParameters,
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
data.splice(0, data.length);
|
data.splice(0, data.length);
|
||||||
@@ -274,6 +295,7 @@ for (let i = 0; i < 3; ++i) {
|
|||||||
height: 4%;
|
height: 4%;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.operation-btn {
|
.operation-btn {
|
||||||
margin-right: 1%;
|
margin-right: 1%;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export default {
|
|||||||
},
|
},
|
||||||
beforeCreate() {
|
beforeCreate() {
|
||||||
//创建表单
|
//创建表单
|
||||||
this.form = this.$form.createForm(this, { name: "form_in_modal" });
|
this.form = this.$form.createForm(this, { name: "addOrUpdateUserModal" });
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -90,7 +90,7 @@ export default {
|
|||||||
message: res.msg,
|
message: res.msg,
|
||||||
});
|
});
|
||||||
form.resetFields();
|
form.resetFields();
|
||||||
this.$emit("updateDialogData", { ok: true, show: false });
|
this.$emit("updateUserDialogData", { ok: true, show: false });
|
||||||
} else {
|
} else {
|
||||||
notification.error({
|
notification.error({
|
||||||
message: res.msg,
|
message: res.msg,
|
||||||
@@ -100,7 +100,7 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
handleCancel() {
|
handleCancel() {
|
||||||
this.$emit("updateDialogData", { ok: false, show: false });
|
this.$emit("updateUserDialogData", { ok: false, show: false });
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
36
ui/src/views/utils/ConfirmDialog.vue
Normal file
36
ui/src/views/utils/ConfirmDialog.vue
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<a-popconfirm
|
||||||
|
:title="title"
|
||||||
|
ok-text="确认"
|
||||||
|
cancel-text="取消"
|
||||||
|
@confirm="confirm"
|
||||||
|
@cancel="cancel"
|
||||||
|
>
|
||||||
|
</a-popconfirm>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "ConfirmDialog",
|
||||||
|
props: {
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
confirmEvent: {
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
confirm(e) {
|
||||||
|
console.log(e);
|
||||||
|
this.$message.success("Click on Yes");
|
||||||
|
},
|
||||||
|
cancel(e) {
|
||||||
|
console.log(e);
|
||||||
|
this.$message.error("Click on No");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
||||||
Reference in New Issue
Block a user