云原生|Go-Micro实践中如何进行权限设置?

一、权限设计模型

本次权限设计使用的模型为RBAC 模型,基于角色的访问控制(Role-Based Access Control)迄今为止最为普及的权限设计模型。
在这里插入图片描述
角色连接用户和权限的关系,每个角色可以关联多个权限,一个用户关联多个角色,那么用户就可以拥有多个角色的多个权限。这样做的好处就是引入了“角色”概念后,管理员只需要把角色赋予给用户,那么用户拥有了角色的所有权限,这样设计可以提升了效率,也提高了扩展性。

权限是可访问资源,这个资源包括页面访问的资源,对某一项操作的权限,数据是否可访问权限等。

//权限设计架构图

在这里插入图片描述

二、权限控制

权限控制分为两个部分:

(一)使用Casbin 做基础的权限验证

Casbin 是一个支持 ACL,RBAC,ABAC 等访问模型,可用于多种语言(如 Golang,Java,C/C++ 等)的授权库。它拥有灵活的策略存储方式,已支持 Mysql,Postgres,Oracle 等数十种数据库。

Casbin 可以:

支持自定义请求的格式,默认的请求格式为{subject, object, action}。

  • 具有访问控制模型model和策略policy两个核心概念。

    扫描二维码关注公众号,回复: 15203945 查看本文章
  • 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。

  • 支持内置的超级用户 例如:root 或 administrator。超级用户可以执行任何操作而无需显式的权限声明。

  • 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

Casbin 不能:

  • 身份认证 authentication(即验证用户的用户名和密码),Casbin 只负责访问控制。应该有其他专门的组件负责身份认证,然后由 Casbin 进行访问控制,二者是相互配合的关系。

  • 管理用户列表或角色列表。Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin 的设计思想并不是把它作为一个存储密码的容器。而是存储RBAC方案中用户和角色之间的映射关系。

基于Casbin权限验证编写成一个API接口,用于验证用户是否有权限访问:

基于Gorm实现Casbin的验证可参考:https://github.com/casbin/gorm-adapter

伪代码可参考:

package main
 
import (
    "github.com/casbin/casbin/v2"
    gormadapter "github.com/casbin/gorm-adapter/v3"
    _ "github.com/go-sql-driver/mysql"
)
 
// 网关中间件中调用Casbin认证
func gateway(){
    
    
    ValidationAuthority("alice", "data1", "read")
}
 
// 使用Gorm验证访问权限
func ValidationAuthority(sub string, obj string, act string) {
    
    
    a, _ := gormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/") // Your driver and data source.
    e, _ := casbin.NewEnforcer("examples/rbac_model.conf", a)
    e.LoadPolicy()
  e.Enforce(sub, obj, act)
    e.SavePolicy()
}

rbac_model.conf 可参考 https://github.com/casbin/casbin

在 Casbin 中, 访问控制模型被抽象为基于 PERM (Policy, Effect, Request, Matcher) 的一个配置文件。因此,切换或升级项目的授权机制与修改配置一样简单。您可以通过组合可用的模型来定制您自己的访问控制模型。例如,您可以在一个model中结合RBAC角色和ABAC属性,并共享一组策略规则。

[request_definition]
r = sub, obj, act
 
[policy_definition]
p = sub, obj, act
 
[role_definition]
g = _, _
 
 
[policy_effect]
e = some(where (p.eft == allow))
 
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

上述文件是Casbin 抽象 RBAC的一个配置文件,Casbin集成了多种角色权限配置,官方提供不同的访问模型策略:https://casbin.org/zh/docs/supported-models
在这里插入图片描述

(二)使用配置文件控制权限的颗粒度

自定义一个 rule_config.yaml 文件定义需要操控的接口,get_app 可以是前端UI组件的别名,也可以是定义的某个组件显示的参数条件,通过key,value 模式来操作UI组件的显示

rule:
    get_app: /api/v1/home/app
    get_defaultApp: /api/v1/home/defaultApp
    get_log: /api/v1/home/log

流程图:
在这里插入图片描述
返回结构:

1.判断是否是系统管理员(定义部分页面只有系统管理员才能访问,比如角色管理,组管理等)

2.动态菜单,通过可访问权限控制菜单列表的显示

3.权限列表,通过权限列表控制页面中颗粒度较细的UI组件

{
    
    
  "is_system_admin": false,
    "menus":[
     "id": 1,
     "name": "index",
     "path": "/index"
  ]
  "rule": [
   "get_app",
   "get_log"
  ]
}

通过配置文件来控制UI界面的组件,这种方式是为了方便后续修改及定义。

以上,就是本次关于Go Micro 项目中权限设置的分享的全部内容了。

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。
公众号搜索神州数码云基地,获得更多技术干货内容。

猜你喜欢

转载自blog.csdn.net/CBGCampus/article/details/130124114