kra/internal/biz/system/casbin.go

110 lines
2.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}