110 lines
2.8 KiB
Go
110 lines
2.8 KiB
Go
package system
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
)
|
||
|
||
// CasbinUsecase Casbin用例
|
||
type CasbinUsecase struct {
|
||
repo CasbinRepo
|
||
authUc *AuthorityUsecase
|
||
apiUc *ApiUsecase
|
||
useStrictAuth bool
|
||
}
|
||
|
||
// NewCasbinUsecase 创建Casbin用例
|
||
func NewCasbinUsecase(repo CasbinRepo, authUc *AuthorityUsecase, apiUc *ApiUsecase) *CasbinUsecase {
|
||
return &CasbinUsecase{
|
||
repo: repo,
|
||
authUc: authUc,
|
||
apiUc: apiUc,
|
||
useStrictAuth: false,
|
||
}
|
||
}
|
||
|
||
// UpdateCasbin 更新Casbin权限
|
||
func (uc *CasbinUsecase) UpdateCasbin(adminAuthorityID, authorityId uint, casbinInfos []struct {
|
||
Path string
|
||
Method string
|
||
}) error {
|
||
// 转换为 CasbinRule
|
||
rules := make([]CasbinRule, len(casbinInfos))
|
||
for i, info := range casbinInfos {
|
||
rules[i] = CasbinRule{
|
||
Path: info.Path,
|
||
Method: info.Method,
|
||
}
|
||
}
|
||
|
||
return uc.repo.UpdateCasbin(adminAuthorityID, authorityId, rules)
|
||
}
|
||
|
||
// GetPolicyPathByAuthorityId 获取权限路径
|
||
func (uc *CasbinUsecase) GetPolicyPathByAuthorityId(authorityId uint) []CasbinRule {
|
||
return uc.repo.GetPolicyPathByAuthorityId(authorityId)
|
||
}
|
||
|
||
// FreshCasbin 刷新Casbin缓存
|
||
func (uc *CasbinUsecase) FreshCasbin() error {
|
||
return uc.repo.FreshCasbin()
|
||
}
|
||
|
||
// CheckPermission 检查权限
|
||
func (uc *CasbinUsecase) CheckPermission(ctx context.Context, sub, obj, act string) (bool, error) {
|
||
// 这里可以添加权限检查逻辑
|
||
return true, nil
|
||
}
|
||
|
||
// ClearCasbin 清除Casbin规则
|
||
func (uc *CasbinUsecase) ClearCasbin(v int, p ...string) bool {
|
||
return uc.repo.ClearCasbin(v, p...)
|
||
}
|
||
|
||
// AddPolicies 添加策略
|
||
func (uc *CasbinUsecase) AddPolicies(rules [][]string) error {
|
||
return uc.repo.AddPolicies(rules)
|
||
}
|
||
|
||
// RemoveFilteredPolicy 删除筛选的策略
|
||
func (uc *CasbinUsecase) RemoveFilteredPolicy(authorityId string) error {
|
||
return uc.repo.RemoveFilteredPolicy(authorityId)
|
||
}
|
||
|
||
// SyncPolicy 同步策略(先删除再添加)
|
||
func (uc *CasbinUsecase) SyncPolicy(authorityId string, rules [][]string) error {
|
||
return uc.repo.SyncPolicy(authorityId, rules)
|
||
}
|
||
|
||
// UpdateCasbinApi API更新随动
|
||
func (uc *CasbinUsecase) UpdateCasbinApi(oldPath, newPath, oldMethod, newMethod string) error {
|
||
return uc.repo.UpdateCasbinApi(oldPath, newPath, oldMethod, newMethod)
|
||
}
|
||
|
||
// ValidateCasbinInfos 验证Casbin信息(严格模式)
|
||
func (uc *CasbinUsecase) ValidateCasbinInfos(ctx context.Context, adminAuthorityID uint, casbinInfos []CasbinRule) error {
|
||
if !uc.useStrictAuth {
|
||
return nil
|
||
}
|
||
|
||
apis, err := uc.apiUc.GetAllApis(ctx, adminAuthorityID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
for _, info := range casbinInfos {
|
||
hasApi := false
|
||
for _, api := range apis {
|
||
if api.Path == info.Path && api.Method == info.Method {
|
||
hasApi = true
|
||
break
|
||
}
|
||
}
|
||
if !hasApi {
|
||
return errors.New("存在api不在权限列表中")
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|