security

package
v0.1.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 8, 2022 License: MIT Imports: 17 Imported by: 0

README

鉴权模块

模块描述

此模块为鉴权功能模块,类似spring-security,但由于当前版本(1.17.2)golang的语法特点,实现注解式鉴权需要的操作,比直接控制router的方式,更复杂、码量更多,因此,仍以router管理的方式实现,具体方法,可阅读security/router.go

这里的权限,参照了罗杨博士casbin的设计逻辑,将权限分为主体、客体、操作三个元素,在请求时,将请求的权限三要素与目标的权限三要素进行匹配判断(match)。

这里的角色,使用父子层级的关系,与权限为多对多的关系,父角色除直属自身的权限外,还递归包含子角色的全部权限。

此模块自带系统超管角色,超管用户ID为1,但暂无用户表,用户表由使用者自行拓展。

使用此模块注册的路由,会自动录入权限入库,并根据路由sub分组,创建相应的微模块角色,这些角色默认会以超管为父角色,你可以根据需要,开发角色管理,将这些角色划归其他角色所有。

security源码结构

  1. security.go

    模块配置入口。

  2. casbin.go

    权限模型文件,包含部分权限的数据库增删改查功能。

  3. role.go

    角色模型文件。

  4. handler.go

    鉴权拦截的函数。

  5. router.go

    鉴权路由相关的代码。封装了Router结构体,并赋予了Regist()函数,该函数主要完成gin框架路由注册、添加jwt和security的路由拦截函数、api权限登记入库三个功能。

  6. metadata.go

    security模块元数据导入。鉴于模块启用早于api的路由登记,所以,需等到web应用启动完成时,才可以进行元数据导入的操作,因此,在security.go中,以异步的方式进行轮询等待。

    go func() {
      for !IsServerRunning {
        time.Sleep(time.Duration(10) * time.Microsecond)
      }
      importMetaData()
    }()
    

Documentation

Index

Constants

View Source
const (
	ACT_RES_READ   int8 = 1 // 针对资源型客体
	ACT_RES_WRITE  int8 = 2 // 针对资源型客体
	ACT_API_ACCESS int8 = 3 // 针对接口型客体

	OBJ_TYPE_RES objType = 1 // 客体类型:资源
	OBJ_TYPE_API objType = 2 // 客体类型:接口
)
View Source
const (
	MethodGet     httpmethod = "GET"
	MethodHead    httpmethod = "HEAD"
	MethodPost    httpmethod = "POST"
	MethodPut     httpmethod = "PUT"
	MethodPatch   httpmethod = "PATCH" // RFC 5789
	MethodDelete  httpmethod = "DELETE"
	MethodConnect httpmethod = "CONNECT"
	MethodOptions httpmethod = "OPTIONS"
	MethodTrace   httpmethod = "TRACE"
)

Variables

View Source
var (
	ErrNoCustomerInfo error = errors.New("无法获取用户信息")
	ErrNoApiPolicy    error = errors.New("接口权限不足")
	ErrPolicyNotFound error = errors.New("找不到权限信息")
)
View Source
var (
	IsServerRunning bool
)

Functions

func GetAllPolicy added in v0.1.2

func GetAllPolicy() map[string][]Policy

func GetSecurityHandler

func GetSecurityHandler() gin.HandlerFunc

Types

type Policy

type Policy struct {
	Sub     string  `json:"sub"`     // 主体,标签值
	ObjType objType `json:"objType"` // 客体类型
	Obj     string  `json:"obj"`     // 客体
	Act     int8    `json:"act"`     // 操作
}

权限

type Role

type Role struct {
	database.BaseModel
	Name         string       `json:"name" gorm:"column:name;type:varchar(256);comment:角色名称"`
	Description  string       `json:"description" gorm:"column:description;type:varchar(1024);comment:描述"`
	RolePolicies []RolePolicy `json:"rolePolicies,omitempty" gorm:"foreignKey:rid;references:id;comment:权限"`
	ParentId     int          `json:"parentId,omitempty" gorm:"column:parent_id;comment:父级角色ID"`
	Parent       *Role        `json:"parent,omitempty" gorm:"foreignKey:id;references:parent_id;comment:父级角色"`
	Children     []Role       `json:"children,omitempty" gorm:"foreignKey:parent_id;references:id;comment:子级角色"`
}

func (Role) Add

func (r Role) Add() (role Role)

func (Role) Delete

func (r Role) Delete() error

func (Role) Match

func (r Role) Match(dest *Policy) bool

func (Role) TableName

func (Role) TableName() string

func (Role) Update

func (r Role) Update() error

type RolePolicy

type RolePolicy struct {
	RoleId    int      `gorm:"column:rid;comment:角色ID"`
	PolicySub string   `gorm:"column:policy_sub;comment:权限主体标记"`
	Policies  []Policy `json:"policies,omitempty" gorm:"-"` // gorm:"foreignKey:id;references:policy_id;comment:权限"`
}

func (RolePolicy) TableName

func (RolePolicy) TableName() string

type Router

type Router struct {
	Method       httpmethod
	SubTag       string
	RelativePath string
	Handler      gin.HandlerFunc
}

func (Router) Regist

func (r Router) Regist()

注册路由

type SecurityConfig

type SecurityConfig struct {
	Enable           bool `mapstructure:"enable" json:"enable" yaml:"enable"`                                   // 是否开启
	EnableRedisCache bool `mapstructure:"enable-redis-cache" json:"enableRedisCache" yaml:"enable-redis-cache"` // 是否开启redis缓存
}

func (SecurityConfig) Load

func (c SecurityConfig) Load()

type UserRole

type UserRole struct {
	Uid    int   `json:"uid" gorm:"column:uid;comment:用户ID"`
	RoleId int   `json:"roleId" gorm:"column:rid;comment:角色ID"`
	Role   *Role `json:"role,omitempty" gorm:"foreignKey:id;references:rid;comment:角色"`
}

func FindUserRoleByUid

func FindUserRoleByUid(uid int) (urs []UserRole, err error)

查询用户完整角色权限

func (UserRole) TableName

func (UserRole) TableName() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL