feat: super 包新增简单的权限控制器,可通过 super.NewPermission 函数进行创建

This commit is contained in:
kercylan98 2023-10-16 12:44:38 +08:00
parent c3538ab530
commit 9e00684902
2 changed files with 106 additions and 0 deletions

78
utils/super/permission.go Normal file
View File

@ -0,0 +1,78 @@
package super
import (
"github.com/kercylan98/minotaur/utils/generic"
"sync"
)
// NewPermission 创建权限
func NewPermission[Code generic.Integer, EntityID comparable]() *Permission[Code, EntityID] {
return &Permission[Code, EntityID]{
permissions: make(map[EntityID]Code),
}
}
type Permission[Code generic.Integer, EntityID comparable] struct {
permissions map[EntityID]Code
l sync.RWMutex
}
// HasPermission 是否有权限
func (slf *Permission[Code, EntityID]) HasPermission(entityId EntityID, permission Code) bool {
slf.l.RLock()
c, exist := slf.permissions[entityId]
slf.l.RUnlock()
if !exist {
return false
}
return c&permission != 0
}
// AddPermission 添加权限
func (slf *Permission[Code, EntityID]) AddPermission(entityId EntityID, permission ...Code) {
slf.l.Lock()
defer slf.l.Unlock()
userPermission, exist := slf.permissions[entityId]
if !exist {
userPermission = 0
slf.permissions[entityId] = userPermission
}
for _, p := range permission {
userPermission |= p
}
slf.permissions[entityId] = userPermission
}
// RemovePermission 移除权限
func (slf *Permission[Code, EntityID]) RemovePermission(entityId EntityID, permission ...Code) {
slf.l.Lock()
defer slf.l.Unlock()
userPermission, exist := slf.permissions[entityId]
if !exist {
return
}
for _, p := range permission {
userPermission &= ^p
}
slf.permissions[entityId] = userPermission
}
// SetPermission 设置权限
func (slf *Permission[Code, EntityID]) SetPermission(entityId EntityID, permission ...Code) {
slf.l.Lock()
defer slf.l.Unlock()
var userPermission Code
for _, p := range permission {
userPermission |= p
}
slf.permissions[entityId] = userPermission
}

View File

@ -0,0 +1,28 @@
package super_test
import (
"github.com/kercylan98/minotaur/utils/super"
"testing"
)
func TestNewPermission(t *testing.T) {
const (
Read = 1 << iota
Write
Execute
)
p := super.NewPermission[int, int]()
p.AddPermission(1, Read, Write)
t.Log(p.HasPermission(1, Read))
t.Log(p.HasPermission(1, Write))
p.SetPermission(2, Read|Write)
t.Log(p.HasPermission(2, Read))
t.Log(p.HasPermission(2, Execute))
p.SetPermission(2, Execute)
t.Log(p.HasPermission(2, Execute))
t.Log(p.HasPermission(2, Read))
t.Log(p.HasPermission(2, Write))
p.RemovePermission(2, Execute)
t.Log(p.HasPermission(2, Execute))
}