108 lines
3.1 KiB
Go
108 lines
3.1 KiB
Go
package impl
|
||
|
||
import (
|
||
"context"
|
||
|
||
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/endpoint"
|
||
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/namespace"
|
||
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/policy"
|
||
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/role"
|
||
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/view"
|
||
"github.com/infraboard/mcube/v2/types"
|
||
)
|
||
|
||
// 查询用户可以访问的空间
|
||
func (i *PolicyServiceImpl) QueryNamespace(ctx context.Context, in *policy.QueryNamespaceRequest) (*types.Set[*namespace.Namespace], error) {
|
||
nsReq := namespace.NewQueryNamespaceRequest()
|
||
|
||
policies, err := i.QueryPolicy(ctx,
|
||
policy.NewQueryPolicyRequest().
|
||
SetSkipPage(true).
|
||
SetUserId(in.UserId).
|
||
SetExpired(false).
|
||
SetEnabled(true))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
policies.ForEach(func(t *policy.Policy) {
|
||
if t.NamespaceId != nil {
|
||
nsReq.AddNamespaceIds(*t.NamespaceId)
|
||
}
|
||
})
|
||
|
||
return i.namespace.QueryNamespace(ctx, nsReq)
|
||
}
|
||
|
||
// 查询用户可以访问的Api接口
|
||
// 找到用户可以访问的角色列表,然后在找出角色对应的Api访问权限
|
||
func (i *PolicyServiceImpl) QueryEndpoint(ctx context.Context, in *policy.QueryEndpointRequest) (*types.Set[*endpoint.Endpoint], error) {
|
||
set := types.New[*endpoint.Endpoint]()
|
||
policies, err := i.QueryPolicy(ctx,
|
||
policy.NewQueryPolicyRequest().
|
||
SetSkipPage(true).
|
||
SetNamespaceId(in.NamespaceId).
|
||
SetUserId(in.UserId).
|
||
SetExpired(false).
|
||
SetEnabled(true))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
roleReq := role.NewQueryMatchedEndpointRequest()
|
||
policies.ForEach(func(t *policy.Policy) {
|
||
roleReq.Add(t.RoleId)
|
||
})
|
||
|
||
if policies.Len() > 0 {
|
||
set, err = role.GetService().QueryMatchedEndpoint(ctx, roleReq)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
}
|
||
|
||
return set, nil
|
||
}
|
||
|
||
// 校验Api接口权限
|
||
func (i *PolicyServiceImpl) ValidateEndpointPermission(ctx context.Context, in *policy.ValidateEndpointPermissionRequest) (*policy.ValidateEndpointPermissionResponse, error) {
|
||
resp := policy.NewValidateEndpointPermissionResponse(*in)
|
||
|
||
// 空间Owner有所有权限
|
||
ns, err := namespace.GetService().DescribeNamespace(ctx, namespace.NewDescribeNamespaceRequest().SetNamespaceId(in.NamespaceId))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if ns.IsOwner(in.UserId) {
|
||
resp.HasPermission = true
|
||
return resp, nil
|
||
}
|
||
|
||
// 非空间管理员需要独立鉴权, 查询用户可以访问的API列表
|
||
endpointReq := policy.NewQueryEndpointRequest()
|
||
endpointReq.UserId = in.UserId
|
||
endpointReq.NamespaceId = in.NamespaceId
|
||
endpointSet, err := i.QueryEndpoint(ctx, endpointReq)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
for _, item := range endpointSet.Items {
|
||
if item.IsMatched(in.Service, in.Method, in.Path) {
|
||
resp.HasPermission = true
|
||
resp.Endpoint = item
|
||
break
|
||
}
|
||
}
|
||
return resp, nil
|
||
}
|
||
|
||
// 查询用户可以访问的菜单
|
||
func (i *PolicyServiceImpl) QueryMenu(ctx context.Context, in *policy.QueryMenuRequest) (*types.Set[*view.Menu], error) {
|
||
return nil, nil
|
||
}
|
||
|
||
// 校验Menu视图权限
|
||
func (i *PolicyServiceImpl) ValidatePagePermission(ctx context.Context, in *policy.ValidatePagePermissionRequest) (*policy.ValidatePagePermissionResponse, error) {
|
||
return nil, nil
|
||
}
|