Gin框架如何使用并搭建一个后台管理系统 RBAC 权限管理(六)

一、RBAC 实现流程

1 、实现角色的增、删、改、查
2 、实现用户的增、删、改、查,增加修改用户的时候需要选择角色
3 、实现权限的增、删、改、查 (页面菜单)
4 、实现角色授权功能
5 、判断当前登录的用户是否有访问菜单的权限
6 、根据当前登录账户的角色信息动态显示左侧菜单

二、用户 RBAC 权限管理树形图

1. 理想的RBAC模型

RBAC模型根据不同业务场景的需要会有很多种演变,实际工作中业务是非常复杂的,权限分配也是非常复杂的,想要做出通用且高效的模型很困难。我们把RBAC模型的演变汇总起来会是一个支撑大数据量以及复杂业务的理想的模型。把RBAC、RBAC1、RBAC2、用户组、组织、职位汇总起来的模型

理想的RBAC模型并不是说我们一开始建权限模型就可以这么做,而是数据体量、业务复杂度达到一定程度之后可以使用这个模型来解决权限的问题,如果数据量特别少,比如刚成立的公司只有十几个人,那完全可以用用户-权限模型,都没有必要使用RBAC模型。

2.标准RBAC模型

有了角色之后可以把权限分配给角色,需要相同权限的用户和角色对应起来就可以了,一个权限可以分配给多个角色,一个角色可以拥有多个权限,同样一个用户可以分配多个角色,一个角色也可以对应多个用户,对应模型如下所示:

这就是经典的RBAC模型了(role-based-access-control),在这里面角色起到了桥梁左右,连接了用户和权限的关系,每个角色可以拥有多个权限,每个用户可以分配多个角色,这样用户就拥有了多个角色的多个权限。

同时因为有角色作为媒介,大大降低了错综复杂的交互关系,比如一家有上万人的公司,角色可能只需要几百个就搞定了,因为很多用户需要的权限是一样的,分配一样的角色就可以了。这种模型的对应关系图如下所示:

用户和角色,角色和权限都是多对多的关系,这种模型是最通用的权限管理模型,节省了很大的权限维护成本, 但是实际的业务千变万化,权限管理的模型也需要根据不同的业务模型适当的调整,比如一个公司内部的组织架构是分层级的,层级越高权限越大,因为层级高的人不仅要拥有自己下属拥有的权限,二期还要有一些额外的权限。

RBAC模型可以给不同层级的人分配不同的角色,层级高的对应角色的权限就多,这样的处理方式可以解决问题,但是有没有更好的解决办法呢,答案肯定是有的,这就引出角色继承的RBAC模型

以角色为学生、教师为例子,大致流程图如下:

 

4.权限模型

 主体(账号、密码)

    资源(资源名称、访问地址)

    权限(权限名称、资源id)

    角色(角色名称)

    角色和权限关系(角色id、权限id)

    主体和角色关系(主体id、角色id)

   如图所示:

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以按照以下步骤来混合使用gin框架和grpc框架一个web服务并运行: 1. 安装gin和grpc框架: ```bash go get -u github.com/gin-gonic/gin go get -u google.golang.org/grpc ``` 2. 创建一个grpc服务: ```go package main import ( "context" "fmt" "net" pb "path/to/your/proto" // 导入你的protobuf文件 "google.golang.org/grpc" ) type server struct{} func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello " + in.Name}, nil } func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { panic(err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) fmt.Println("grpc server started on port 50051...") if err := s.Serve(lis); err != nil { panic(err) } } ``` 3. 创建一个gin服务: ```go package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "Hello World!", }) }) fmt.Println("gin server started on port 8080...") router.Run(":8080") } ``` 4. 将grpc服务和gin服务结合: ```go package main import ( "context" "fmt" "net" pb "path/to/your/proto" // 导入你的protobuf文件 "github.com/gin-gonic/gin" "google.golang.org/grpc" ) type server struct{} func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello " + in.Name}, nil } func main() { // grpc server go func() { lis, err := net.Listen("tcp", ":50051") if err != nil { panic(err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) fmt.Println("grpc server started on port 50051...") if err := s.Serve(lis); err != nil { panic(err) } }() // gin server router := gin.Default() router.GET("/", func(c *gin.Context) { // grpc client conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() client := pb.NewGreeterClient(conn) // call grpc service resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "world"}) if err != nil { panic(err) } c.JSON(200, gin.H{ "message": resp.Message, }) }) fmt.Println("gin server started on port 8080...") router.Run(":8080") } ``` 5. 运行服务: ```bash go run main.go ``` 现在,你就可以通过访问 `http://localhost:8080`,来调用grpc服务并获取响应了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

匠造一知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值