DevChat 初探之 RBAC 模型的实现

news2024/11/18 10:45:29

今天我们来尝试一款编程辅助助手 DevChat, 看能不能提升咱们的日常编程效率。作为一款编程助手,我们来看看它与 Copilot, CodeWhisperer 同领域产品的一些区别和特色。定个小目标,通过 DevChat 实现一个简单的 RBAC 模型,小试牛刀一下,看看整个过程是不是足够丝滑。

首先讲讲这个安装过程还是挺便捷的,以 VsCode 插件的形式,便于开发者直接在开发过程中无缝衔接,不需要单独下载软件,边开发边聊天,跟它聊完天,开发任务也完成了,整个思路还是不错的。插件仅需将对应的 Key 填写即可生效,相对于其他的几个产品有一定便捷性的优势,不要额外登陆账号。

接下来开始我们的编程,小小的让它用 Go 语言实现一个 RBAC 权限模型。

/code Can you implement the RBAC model by Golang?

在这里插入图片描述

package main

import "fmt"

// Define roles
const (
	RoleGuest = "guest"
	RoleUser  = "user"
	RoleAdmin = "admin"
)

// User struct to hold user information
type User struct {
	Name string
	Role string
}

// Permissions struct to define allowed actions for a role
type Permissions struct {
	CanView   bool
	CanEdit   bool
	CanDelete bool
}

// RolePermissionsMap maps roles to their respective permissions
var RolePermissionsMap = map[string]Permissions{
	RoleGuest: {
		CanView:   true,
		CanEdit:   false,
		CanDelete: false,
	},
	RoleUser: {
		CanView:   true,
		CanEdit:   true,
		CanDelete: false,
	},
	RoleAdmin: {
		CanView:   true,
		CanEdit:   true,
		CanDelete: true,
	},
}

// CheckPermission checks if a user has permission for a specific action
func CheckPermission(user User, action string) bool {
	permissions := RolePermissionsMap[user.Role]

	switch action {
	case "view":
		return permissions.CanView
	case "edit":
		return permissions.CanEdit
	case "delete":
		return permissions.CanDelete
	default:
		return false
	}
}

func main() {
	// Create some users
	user1 := User{"John", RoleGuest}
	user2 := User{"Alice", RoleUser}
	user3 := User{"Admin", RoleAdmin}

	// Example usage
	fmt.Println(user1.Name, "can view:", CheckPermission(user1, "view"))     // Output: true
	fmt.Println(user2.Name, "can delete:", CheckPermission(user2, "delete")) // Output: false
	fmt.Println(user3.Name, "can edit:", CheckPermission(user3, "edit"))     // Output: true
}

这里我们可以看到,给出的 Demo 基本符合要求,实现了一个简单的 RBAC 模型,同时为我们生成了一定的例子。

接下来我们要进行一定的业务调整考考它,现在假如来了一个新的需求,添加一个超级管理员,如果是超级管理员,拥有所有权限,看它能否成功实现。

/code Based on the above code, implement a super administrator role, if it is a super administrator it has all permissions

这里其实有两个考点,一个是能否正常的关联上下文,牛头不对马嘴的回答就毫无意义,然后是正确理解需求,实现需求的过程。我们来看看它的回答。

在这里插入图片描述


Certainly! Here is an implementation that includes a super administrator role, which has all permissions:

```go
package main

import "fmt"

// Define roles
const (
	RoleGuest   = "guest"
	RoleUser    = "user"
	RoleAdmin   = "admin"
	RoleSuperAdmin = "superadmin"
)

// User struct to hold user information
type User struct {
	Name string
	Role string
}

// Permissions struct to define allowed actions for a role
type Permissions struct {
	CanView   bool
	CanEdit   bool
	CanDelete bool
}

// RolePermissionsMap maps roles to their respective permissions
var RolePermissionsMap = map[string]Permissions{
	RoleGuest: {
		CanView:   true,
		CanEdit:   false,
		CanDelete: false,
	},
	RoleUser: {
		CanView:   true,
		CanEdit:   true,
		CanDelete: false,
	},
	RoleAdmin: {
		CanView:   true,
		CanEdit:   true,
		CanDelete: true,
	},
	RoleSuperAdmin: {
		CanView:   true,
		CanEdit:   true,
		CanDelete: true,
	},
}

// CheckPermission checks if a user has permission for a specific action
func CheckPermission(user User, action string) bool {
	permissions := RolePermissionsMap[user.Role]

	switch action {
	case "view":
		return permissions.CanView
	case "edit":
		return permissions.CanEdit
	case "delete":
		return permissions.CanDelete
	default:
		return false
	}
}

func main() {
	// Create some users
	user1 := User{"John", RoleGuest}
	user2 := User{"Alice", RoleUser}
	user3 := User{"Admin", RoleAdmin}
	user4 := User{"SuperAdmin", RoleSuperAdmin}

	// Example usage
	fmt.Println(user1.Name, "can view:", CheckPermission(user1, "view"))      // Output: true
	fmt.Println(user2.Name, "can delete:", CheckPermission(user2, "delete"))  // Output: false
	fmt.Println(user3.Name, "can edit:", CheckPermission(user3, "edit"))      // Output: true
	fmt.Println(user4.Name, "can delete:", CheckPermission(user4, "delete"))  // Output: true
}
```

In this implementation, the super administrator has all permissions, so it will return `true` for all actions.

很好,上下文关联正常,没有出现新生成的内容和历史内容无关的情况,并且成功实现了对应的超级管理员需求。

成功实现了实现初始需求,和新增需求,我们是不是该测试一下它测试用例实现情况。

/code Generate corresponding test cases based on the above code

在这里插入图片描述

package main

import (
	"fmt"
	"testing"
)

func TestCheckPermission(t *testing.T) {
	user1 := User{"John", RoleGuest}
	user2 := User{"Alice", RoleUser}
	user3 := User{"Admin", RoleAdmin}
	user4 := User{"SuperAdmin", RoleSuperAdmin}

	testCases := []struct {
		user          User
		action        string
		expectedValue bool
	}{
		{user1, "view", true},         // Guest user can view
		{user1, "edit", false},        // Guest user can't edit
		{user2, "view", true},         // User can view
		{user2, "edit", true},         // User can edit
		{user2, "delete", false},      // User can't delete
		{user3, "view", true},         // Admin can view
		{user3, "edit", true},         // Admin can edit
		{user3, "delete", true},       // Admin can delete
		{user4, "view", true},         // SuperAdmin can view
		{user4, "edit", true},         // SuperAdmin can edit
		{user4, "delete", true},       // SuperAdmin can delete
		{User{"Unknown", "unknown"}, "view", false}, // Unknown user role
		{user1, "unknown", false},     // Unknown action
	}

	for _, testCase := range testCases {
		result := CheckPermission(testCase.user, testCase.action)
		if result != testCase.expectedValue {
			t.Errorf("Failed test case for user '%s' and action '%s'. Expected: %t, got: %t",
				testCase.user.Name, testCase.action, testCase.expectedValue, result)
		}
	}
}

不错,对应的测试用例也补充完整了,测试用例也成功通过。

在这里插入图片描述

从初期的 Demo 实现到需求变更,最后的测试用例编写。DevChat 都能很好的胜任我们的工作,语义的正确理解,上下文的正确关联,都表现得十分出色。体验下来还是有不错的产品特色,支持多个大语言模型,从海外的 ChatGPT 到国内的火星大模型,都有对应的接入,像一个聚合的百宝箱一样,给开发人员带来惊喜。

KOL粉丝专属福利介绍,参赛成功的KOL会有专属红包兑换码,11月31日之前,粉丝可借助邀请码在Devchat兑换10元余额。

下载官网:https://www.devchat.ai

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1200277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机CentOS 8 重启后不能上网

情况说明:原本虚拟机是可以上网的,然后嘚一下,重启后,连接不上网络,完了,上网查找一堆质料,我的连接方式是桥接模式(复制物理网络连接状态)。 好,有人说是vmn…

C++: 内存管理 (new / delete)

文章目录 一. C/C 内存分布二. C 语言中动态内存管理方式: malloc/calloc/realloc/free三. C内存管理方式1. new / delete 操作内置类型2. new / delete 操作自定义类型 四. operator new 与 operator delete 函数五. new 和 delete 的实现原理1. 内置类型2. 自定义类型 六. 定…

双11终极官方战报 凯迪仕智能锁全网全渠道第一 持续领跑智能锁行业

一年一度双11狂欢盛典暂时落下帷幕,作为下半年最大的电商购物节,本次双11电商平台借机推出优惠券、补贴、折扣等促销活动,激发消费者购物热情。其中,智能门锁等智能家居产品更是取得了亮眼的成交。 据悉,凯迪仕智能锁双…

自定义Graph Component:1-开发指南

可以使用自定义NLU组件和策略扩展Rasa,本文提供了如何开发自己的自定义Graph Component指南。   Rasa提供各种开箱即用的NLU组件和策略。可以使用自定义Graph Component对其进行自定义或从头开始创建自己的组件。   要在Rasa中使用自定义Graph Component&#x…

Pinia 状态管理器 菠萝:Setup Store风格

Pinia介绍: Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。 Pinia 大小只有 1kb 左右,超轻量级,你甚至可能忘记它的存在! 相比 Vuex,Pinia 的优点: 更贴合 Vue 3 的 Composition API 风…

C语言从入门到精通之【数据类型和关键字】

数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量(constant)。其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量(variable)。 变量类型有几种…

golang Copier 数据复制

Copier I am a copier, I copy everything from one to another Copier是golang实现的,实现不同数据结构之间数据复制的工具包 github地址 使用方法 以User和Employee之间相互复制为例 使用的版本为 v0.3.5 入门 package mainimport ("fmt""git…

基于SSM的数据结构课程网络学习平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

BM65 最长公共子序列(二)

动态规划 BM65 最长公共子序列(二) 这道题是动态规划的典型例题。 思路 题目要求获取最长公共子序列,我们要先求最长公共子序列的长度,然后根据这个长度倒推从而获取这个子序列。注意:子序列不是子串,子…

springboot的配置信息的设置和读取(application.properties/application.yml)

springboot提供了两种配置信息的文件格式,application.properties和application.yml,基于直接明了,使用方便和高效的前提下下面的配置均采用yml格式配置, 注意 yml采用缩减方式来排列键后面紧跟冒号,然后空格&#x…

数据结构—内部排序(上)

文章目录 8.内部排序(上)(1).排序基础#1.为什么是内部排序#2.排序的稳定性 (2).冒泡排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (3).选择排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (4).插入排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (5).希…

文心一言 VS 讯飞星火 VS chatgpt (133)-- 算法导论11.2 5题

五、用go语言,假设将一个具有n个关键字的集合存储到一个大小为 m 的散列表中。试说明如果这些关键字均源于全域U,且|U|>nm,则U 中还有一个大小为n 的子集,其由散列到同一槽位中的所有关键字构成,使得链接法散列的查…

三分钟学完Git版本控制常用指令

基本指令 git clone [url] 克隆远程仓库到本地 git clone https://gitee.com/mayun2023a/mprpc.git2.git checkout -b xxx 切换至新分支xxx(相当于复制了remote的仓库到本地的xxx分支上) 3.修改或者添加本地代码(部署在硬盘的源文件上) 4.g…

LabVIEW中如何在网络上使用远程VI服务器

LabVIEW中如何在网络上使用远程VI服务器 如何在网络上使用远程VI服务器? 解答: 首先,需要在远程的计算机上打开一个在VI服务器上的LabVIEW应用程序的引用。这可以通过“Open ApplicationReference“函数实现。然后用“Open VI Reference”函数打开一个…

【入门Flink】- 10基于时间的双流联合(join)

统计固定时间内两条流数据的匹配情况,需要自定义来实现——可以用窗口(window)来表示。为了更方便地实现基于时间的合流操作,Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结(Window Join) 一…

Acer宏碁Aspire A715-75G笔记本工厂模式原厂Windows10预装OEM系统2004带恢复功能

下载链接:https://pan.baidu.com/s/1nJFd25lElc1VAPf_RqSDYA?pwdd05h 提取码:d05h 原装出厂系统自带所有驱动、Office办公软件、出厂主题壁纸、系统属性Acer宏基专属的LOGO标志、 Acer Care Center、Quick Access等预装程序 所需要工具&#xff1a…

Linux文件系统(1)

Linux文件系统(1) 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容从系统层面重新认识我们的文件系统 文…

关于值传递和引用传递的问题记录

目录 1. 问题概述 1.1 测试 1.2 结果 2. ArrayList和Arrays.ArrayList 1. 问题概述 最近忙着写论文很久没更新了&#xff0c;趁现在有时间简单记录一下最近遇到的一个坑。 对于Java中的List<>类型的对象&#xff0c;按我以前理解是引用传递&#xff0c;但有一点要注…

Java12新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 今天我们来介绍一下Java12版本的新增特性 版本介绍 Java 12是Java SE的第12个版本&#xff0c;于2019年3月19日发布。这个…