首页 > 其他分享 >1、权限管理

1、权限管理

时间:2023-05-23 18:33:28浏览次数:32  
标签:string err 管理 json act 权限 gorm sub

简易版

import (
	"log"

	"github.com/casbin/casbin/v2"
	"github.com/casbin/casbin/v2/model"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	_ "github.com/go-sql-driver/mysql"
)

// 初始化适配器
func casbinInit() {
	// 使用gorm适配器
	a, _ := gormadapter.NewAdapterByDBUseTableName(global.Orm, "", "casbin_rule_test")

	m, err := model.NewModelFromString(`
	[request_definition]
	r = sub, obj, act

	[policy_definition]
	p = sub, obj, act

	[policy_effect]
	e = some(where (p.eft == allow))

	[matchers]
	m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
	`)
	if err != nil {
		log.Fatalf("error: model: %s", err)
	}

	e, err := casbin.NewEnforcer(m, a)
	if err != nil {
		log.Fatalf("error: enforcer: %s", err)
	}
}

// VerifyPermission 验证用户权限
// sub 想要访问资源的用户
// obj 将要被访问的资源
// act 用户对资源实施的操作
func VerifyPermission(sub, obj, act string) bool {

	ok, err := e.Enforce(sub, obj, act)

	if err != nil {
		// 处理错误
	}

	if ok == true {
		// 允许 alice 读取 data1
	} else {
		// 拒绝请求,抛出异常
	}
	return false
}

详细版:一、api管理

存储所有的api信息

结构

type SysApi struct {
	gorm.Model
	Path        string `json:"path" gorm:"comment:api路径"`             // api路径
	Description string `json:"description" gorm:"comment:api中文描述"`    // api中文描述
	ApiGroup    string `json:"apiGroup" gorm:"comment:api组"`          // api组
	Method      string `json:"method" gorm:"default:POST;comment:方法"` // 方法:创建POST(默认)|查看GET|更新PUT|删除DELETE
}

给用户角色绑定api

func (casbinService *CasbinService) UpdateCasbin(AuthorityID uint, casbinInfos []request.CasbinInfo) error {
	authorityId := strconv.Itoa(int(AuthorityID))
	casbinService.ClearCasbin(0, authorityId)
	rules := [][]string{}
	for _, v := range casbinInfos {
		rules = append(rules, []string{authorityId, v.Path, v.Method})
	}
	e := casbinService.Casbin()
	success, _ := e.AddPolicies(rules)
	if !success {
		return errors.New("存在相同api,添加失败,请联系管理员")
	}
	err := e.InvalidateCache()
	if err != nil {
		return err
	}
	return nil
}

casbinService.Casbin()为

func (casbinService *CasbinService) Casbin() *casbin.CachedEnforcer {
	once.Do(func() {
		a, err := gormadapter.NewAdapterByDB(global.GVA_DB)
		if err != nil {
			zap.L().Error("适配数据库失败请检查casbin表是否为InnoDB引擎!", zap.Error(err))
			return
		}
		text := `
		[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 = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act
		`
		m, err := model.NewModelFromString(text)
		if err != nil {
			zap.L().Error("字符串加载模型失败!", zap.Error(err))
			return
		}
		cachedEnforcer, _ = casbin.NewCachedEnforcer(m, a)
		cachedEnforcer.SetExpireTime(60 * 60)
		_ = cachedEnforcer.LoadPolicy()
	})
	return cachedEnforcer
}

通过角色id获取api权限

func (casbinService *CasbinService) GetPolicyPathByAuthorityId(AuthorityID uint) (pathMaps []request.CasbinInfo) {
	e := casbinService.Casbin()
	authorityId := strconv.Itoa(int(AuthorityID))
	list := e.GetFilteredPolicy(0, authorityId)
	for _, v := range list {
		pathMaps = append(pathMaps, request.CasbinInfo{
			Path:   v[1],
			Method: v[2],
		})
	}
	return pathMaps
}

api权限校验代码(中间件)

// 从context获取信息
waitUse, _ := utils.GetClaims(c)
//获取请求的PATH
path := c.Request.URL.Path
obj := strings.TrimPrefix(path, global.GVA_CONFIG.System.RouterPrefix)
// 获取请求方法
act := c.Request.Method
// 获取用户的角色
sub := strconv.Itoa(int(waitUse.AuthorityId))
e := casbinService.Casbin() // 判断策略中是否存在
success, _ := e.Enforce(sub, obj, act)
if !success {
	fmt.Println("权限不足")
	return
}

二、菜单管理

不同的角色对应不同的菜单权限

type SysMenu struct {
	SysBaseMenu
	MenuId      string                 `json:"menuId" gorm:"comment:菜单ID"`
	AuthorityId uint                   `json:"-" gorm:"comment:角色ID"`
	Children    []SysMenu              `json:"children" gorm:"-"`
	Parameters  []SysBaseMenuParameter `json:"parameters" gorm:"foreignKey:SysBaseMenuID;references:MenuId"`
	Btns        map[string]uint        `json:"btns" gorm:"-"`
}

type SysAuthorityMenu struct {
	MenuId      string `json:"menuId" gorm:"comment:菜单ID;column:sys_base_menu_id"`
	AuthorityId string `json:"-" gorm:"comment:角色ID;column:sys_authority_authority_id"`
}

SysAuthorityMenu 表,通过角色id可查询所有menuid

三、角色管理

存储所有角色信息

type SysAuthority struct {
	CreatedAt       time.Time       // 创建时间
	UpdatedAt       time.Time       // 更新时间
	DeletedAt       *time.Time      `sql:"index"`
	AuthorityId     uint            `json:"authorityId" gorm:"not null;unique;primary_key;comment:角色ID;size:90"` // 角色ID
	AuthorityName   string          `json:"authorityName" gorm:"comment:角色名"`                                    // 角色名
	ParentId        *uint           `json:"parentId" gorm:"comment:父角色ID"`                                       // 父角色ID
	DataAuthorityId []*SysAuthority `json:"dataAuthorityId" gorm:"many2many:sys_data_authority_id;"`
	Children        []SysAuthority  `json:"children" gorm:"-"`
	SysBaseMenus    []SysBaseMenu   `json:"menus" gorm:"many2many:sys_authority_menus;"`
	Users           []SysUser       `json:"-" gorm:"many2many:sys_user_authority;"`
	DefaultRouter   string          `json:"defaultRouter" gorm:"comment:默认菜单;default:dashboard"` // 默认菜单(默认dashboard)
}

标签:string,err,管理,json,act,权限,gorm,sub
From: https://www.cnblogs.com/mingliangge/p/17404291.html

相关文章

  • 上下文管理者(ServletContext)
    作用1.获取全局初始化参数2.资源共享(servlet通信)能让上下文呢的Servlet相互关联起来3.获取资源文件生命周期创建服务器启动的时候会为每个项目创建一个servletContext上下文对象,servleContext是项目的一个引用销毁在服务器关闭或者移除项目的时候servletContext销毁获取方......
  • 使用n对Mac上的Node版本进行管理及升降
    n如果在我的电脑上已经安装了nodejs,但是觉得这个版本不好用,或者是不兼容公司的项目,那么可以使用n进行node的版本管理。n相对于nvm来说,安装起来还是非常方便的。安装1.首先确定nodejs版本,确定已安装nodejsnode-v2.清除nodejs的缓存sudonpmcacheclean-f3.使用npm全......
  • Linux文件权限
    Linux的安全性Linux安全系统的核心是用户账户。每个能访问Linux系统的用户都会被分配一个唯一的用户账户。用户权限是通过创建用户时分配的用户ID(userID,UID)来跟踪的。用户在登录系统时是使用登录名(loginname)来代替UID登录的登录名是用户用来登录系统的最长8字符的字符串(字......
  • 管理文件系统
    管理文件系统Linux文件系统Linux文件系统的演进1.ext文件系统Linux操作系统最初引入的文件系统叫作扩展文件系统(extendedfilesystem,简称ext),它为Linux提供了一个基本的类Unix文件系统。ext文件系统使用i节点(inode)跟踪存储在虚拟目录中文件的相关信息。ext文件系统名称中的ex......
  • Android开发 UsageStatsManager应用使用情况管理
    前言  UsageStatsManager是用来知晓,设备中应用的使用情况的管理。它能给我们提供应用的进入前台动作与时间戳、进入后台的动作与时间戳、上次的使用时间、使用总时长等等信息。此功能在原生的设置-应用-使用统计中有所展示。所需权限<uses-permissionandroid:name="android.......
  • 6、CSRF漏洞管理
    一、CSRF概念答:全称是Cross-siterequestforgery,跨站请求伪造,我们可以理解未这种漏洞为攻击者利用被攻击者的身份发起了某些被攻击者原本不知情的网络请求,包括以被攻击者的身份发布微博,留言等。CSRF能够发邮件,发消息,盗取账户,购买商品,虚拟货币转账等。二、CSRF漏洞原理......
  • 源代码管理工具GitHub介绍
    GitHub是一个基于Web的Git代码托管平台,该平台提供的服务包括代码托管、代码审查、协作、项目管理等,旨在帮助开发者更加方便地进行软件开发和协作。下面主要从GitHub主要页面功能和如何利用GitHub辅助完成团队项目两个方面进行简单的介绍。1.Git和GitHubGit和GitHub是两个东......
  • iOS UIView如何管理它的子视图
    didMoveToWindow 通知接收者它一斤给添加到窗口中 -(void)didMoveToWindow 讨论 默认实现不做任何事情;子类可以重写这个方法来做特殊的实现 窗口的属性有可能是nil当这个方法调用的时候,这表明接收者并不属于当然任何一个窗口。这个只发生在接收者从它的父视图上移......
  • Nginx 可视化神器!复杂配置一键生成,监控管理一条龙!
    功能说明nginxWebUI是一款图形化管理nginx配置的工具,可以使用网页来快速配置nginx的各项功能,包括http协议转发、tcp协议转发、反向代理、负载均衡、静态html服务器、ssl证书自动申请、续签、配置等。配置好后可一建生成nginx.conf文件,同时可控制nginx使用此文件进行启动与重载,完成......
  • 【CentOS 7系统管理员必看】如何轻松检测软中断,优化系统性能?
    在CentOS7中,软中断是一种中断类型,它由内核发起并在内核空间中执行,用于处理网络、存储和其他异步事件。软中断的主要工作是将网络数据包、磁盘IO等异步事件传递给应用程序的工作队列中,以便应用程序可以及时处理这些事件。然而,如果软中断的数量过多,就会对系统的性能产生负面影响,......