casbin

package
v0.0.3 Latest Latest
Warning

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

Go to latest
Published: Mar 2, 2026 License: Apache-2.0 Imports: 12 Imported by: 0

README

Casbin 权限管理快速指南

📖 详细文档:请查看 Casbin权限管理.md

快速开始

1. 使用 GORM 定义模型
type Permission struct {
    ID       uint   `gorm:"primaryKey"`
    Role     string `gorm:"type:varchar(50);not null;index"`
    Resource string `gorm:"type:varchar(255);not null;index"`
    Action   string `gorm:"type:varchar(10);not null"`
    CreatedAt time.Time
}

type UserRole struct {
    ID       uint   `gorm:"primaryKey"`
    UserID   string `gorm:"type:varchar(50);not null;index"`
    Role     string `gorm:"type:varchar(50);not null;index"`
    CreatedAt time.Time
}
2. 实现 PolicyProvider 接口
type PolicyProvider struct {
    db *gorm.DB
}

func (p *PolicyProvider) LoadPolicies(ctx context.Context) ([]string, error) {
    var permissions []Permission
    if err := p.db.WithContext(ctx).Find(&permissions).Error; err != nil {
        return nil, err
    }

    policies := make([]string, 0, len(permissions))
    for _, perm := range permissions {
        policies = append(policies, fmt.Sprintf("p, %s, %s, %s", 
            perm.Role, perm.Resource, perm.Action))
    }
    return policies, nil
}

func (p *PolicyProvider) LoadRolePolicies(ctx context.Context) ([]string, error) {
    var userRoles []UserRole
    if err := p.db.WithContext(ctx).Find(&userRoles).Error; err != nil {
        return nil, err
    }

    rolePolicies := make([]string, 0, len(userRoles))
    for _, ur := range userRoles {
        rolePolicies = append(rolePolicies, fmt.Sprintf("g, %s, %s", 
            ur.UserID, ur.Role))
    }
    return rolePolicies, nil
}
3. 初始化并使用
// 创建管理器
policyProvider := &PolicyProvider{db: db}
manager, _ := casbin.NewManager(casbin.Options{
    PolicyProvider: policyProvider,
    CacheEnabled:  true,
})

// 创建中间件
casbinMiddleware := casbin.NewBuilder(manager).Build()

// 应用到路由
r.Use(casbinMiddleware)

重要说明

✅ 使用 GORM 完全没有影响

无论你使用:

  • GORM
  • Ent
  • XORM
  • 原生 SQL

只要实现了 PolicyProvider 接口,就可以正常工作。这正是接口抽象设计的优势!

📚 完整文档

详细的使用说明、集成步骤、最佳实践等,请查看:

核心概念

  • 策略格式p, 角色, 资源, 操作,如 p, admin, /api/users, GET
  • 角色继承g, 用户, 角色,如 g, user123, admin
  • 资源匹配:默认格式 路径:方法,如 /api/users:GET

常见问题

Q: 使用 GORM 存储策略会有影响吗?
A: 完全没有影响!这正是接口抽象设计的优势。

Q: 策略什么时候加载?
A: 启动时自动加载一次,之后可以手动调用 RefreshPolicies() 刷新。

Q: 如何提高性能?
A: 启用缓存(CacheEnabled: true),角色信息存储在 Session Claims 中。

更多问题请查看 详细文档

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewMemoryAdapter

func NewMemoryAdapter() persist.Adapter

NewMemoryAdapter 创建内存适配器

func RequirePermission

func RequirePermission(manager *Manager, resource, action string) gin.HandlerFunc

RequirePermission 创建需要特定权限的中间件 用于在路由中直接指定需要的权限

Types

type Builder

type Builder struct {
	// contains filtered or unexported fields
}

Builder Casbin 中间件构建器

func NewBuilder

func NewBuilder(manager *Manager) *Builder

NewBuilder 创建 Casbin 中间件构建器

func (*Builder) Build

func (b *Builder) Build() gin.HandlerFunc

Build 构建中间件

type DefaultResourceMatcher

type DefaultResourceMatcher struct{}

DefaultResourceMatcher 默认资源匹配器 直接使用路径和方法作为资源标识

func (*DefaultResourceMatcher) Match

func (m *DefaultResourceMatcher) Match(path string, method string) string

Match 实现 ResourceMatcher 接口

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager Casbin 管理器

func NewManager

func NewManager(opts Options) (*Manager, error)

NewManager 创建 Casbin 管理器

func (*Manager) Enforce

func (m *Manager) Enforce(subject, object, action string) (bool, error)

Enforce 执行权限检查 subject: 主体(通常是用户 ID 或角色) object: 对象(资源) action: 操作

func (*Manager) GetEnforcer

func (m *Manager) GetEnforcer() *casbin.Enforcer

GetEnforcer 获取 Casbin Enforcer(用于高级用法)

func (*Manager) LoadPolicies

func (m *Manager) LoadPolicies(ctx context.Context) error

LoadPolicies 加载策略

func (*Manager) RefreshPolicies

func (m *Manager) RefreshPolicies(ctx context.Context) error

RefreshPolicies 刷新策略

type Options

type Options struct {
	// ModelPath Casbin 模型文件路径
	// 如果为空,使用默认的 RBAC 模型
	ModelPath string

	// PolicyProvider 策略提供者
	// 必须实现,用于加载策略规则
	PolicyProvider PolicyProvider

	// UserRoleProvider 用户角色提供者
	// 可选,如果不提供,将从 Session 的 Claims 中获取角色
	UserRoleProvider UserRoleProvider

	// ResourceMatcher 资源匹配器
	// 可选,默认使用 DefaultResourceMatcher
	ResourceMatcher ResourceMatcher

	// AutoLoad 是否自动加载策略
	// 如果为 true,每次请求都会重新加载策略(不推荐,性能差)
	// 如果为 false,需要手动调用 RefreshPolicies() 刷新策略
	AutoLoad bool

	// CacheEnabled 是否启用策略缓存
	// 如果为 true,策略会被缓存,需要手动刷新
	CacheEnabled bool
}

Options Casbin 配置选项

type PathResourceMatcher

type PathResourceMatcher struct{}

PathResourceMatcher 路径资源匹配器 只使用路径作为资源标识,忽略方法

func (*PathResourceMatcher) Match

func (m *PathResourceMatcher) Match(path string, method string) string

Match 实现 ResourceMatcher 接口

type Permission

type Permission struct {
	Resource string // 资源路径,如 /api/users
	Action   string // 操作,如 GET, POST, DELETE, PUT
}

Permission 权限定义

type PolicyProvider

type PolicyProvider interface {
	// LoadPolicies 加载所有策略规则
	// 返回策略规则列表,格式:["p, admin, /api/users, GET", "p, user, /api/profile, GET"]
	// 或者返回空切片,表示从其他方式加载策略
	LoadPolicies(ctx context.Context) ([]string, error)

	// LoadRolePolicies 加载角色继承关系
	// 返回角色继承规则列表,格式:["g, alice, admin", "g, bob, user"]
	LoadRolePolicies(ctx context.Context) ([]string, error)
}

PolicyProvider 策略提供者接口 引用项目需要实现此接口,提供策略数据

type ResourceMatcher

type ResourceMatcher interface {
	// Match 将请求路径和方法转换为资源标识
	// path: 请求路径,如 /api/users/123
	// method: HTTP 方法,如 GET, POST
	// 返回资源标识,如 /api/users
	Match(path string, method string) string
}

ResourceMatcher 资源匹配器接口 用于将请求路径和方法转换为 Casbin 资源格式

type UserRoleProvider

type UserRoleProvider interface {
	// GetUserRoles 获取用户的角色列表
	// userId: 用户 ID
	// 返回角色列表,如 ["admin", "user"]
	GetUserRoles(ctx context.Context, userId string) ([]string, error)
}

UserRoleProvider 用户角色提供者接口 用于获取用户的角色信息

Jump to

Keyboard shortcuts

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