Skip to content
Snippets Groups Projects
Commit 52813347 authored by Alena Petraki's avatar Alena Petraki
Browse files

Перенос 'auth'

parent 8ac79965
No related branches found
No related tags found
No related merge requests found
......@@ -143,7 +143,7 @@ func (c *ClientPrincipal) Client(ctx context.Context) (*clients.Client, error) {
}
func (c *ClientPrincipal) HasEnvironmentAccess(ctx context.Context, spaceID, envID string) bool {
return hasEnvironmentAccess(ctx, c.environments, c.Role(ctx, spaceID), envID)
return c.Role(ctx, spaceID).CanAccessEnvironment(WithSystem(ctx), c.environments, spaceID, envID)
}
func (c *ClientPrincipal) getRoleID(ctx context.Context, spaceID string) (string, bool) {
......@@ -203,7 +203,7 @@ func (c *ClientPrincipal) Rules(ctx context.Context, spaceID, envID string) perm
return permission.PrivilegedRuleset{}
}
if hasEnvironmentAccess(ctx, c.environments, role, envID) {
if role.CanAccessEnvironment(WithSystem(ctx), c.environments, spaceID, envID) {
return role.Rules
}
return nil
......
package auth
import service "git.perx.ru/perxis/perxis/services"
import (
"git.perx.ru/perxis/perxis-go/pkg/errors"
)
var (
ErrAccessDenied = service.ErrAccessDenied
ErrAccessDenied = errors.PermissionDenied(errors.New("access denied"))
ErrNotFound = errors.NotFound(errors.New("not found"))
)
......@@ -9,10 +9,6 @@ import (
)
const (
// todo: объединить OAuth2IdentityMetadata, TLSIdentityMetadata, AuthorizationMetadata
// в один заголовок ??
OAuth2IdentityMetadata = "x-perxis-identity"
TLSIdentityMetadata = "x-forwarded-client-cert"
AccessMetadata = "x-perxis-access"
......@@ -49,7 +45,6 @@ func ContextToGRPC() kitgrpc.ClientRequestFunc {
switch p := p.(type) {
case *UserPrincipal:
if p.GetIdentity(ctx) != "" {
//ctx = metadata.AppendToOutgoingContext(ctx, OAuth2IdentityMetadata, p.GetIdentity(ctx))
(*md)[OAuth2IdentityMetadata] = []string{p.GetIdentity(ctx)}
}
case *ClientPrincipal:
......@@ -72,6 +67,8 @@ func ContextToGRPC() kitgrpc.ClientRequestFunc {
}
}
// PrincipalServerInterceptor - grpc-интерсептор, который используется для получения данных принципала из grpc-метаданы и добавления в контекст ''. В случае, если
// сервис не использует проверку прав 'Principal' к системе, в параметрах передается пустой объект '&PrincipalFactory{}'
func PrincipalServerInterceptor(factory *PrincipalFactory) grpc.UnaryServerInterceptor {
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
if md, ok := metadata.FromIncomingContext(ctx); ok {
......@@ -81,6 +78,8 @@ func PrincipalServerInterceptor(factory *PrincipalFactory) grpc.UnaryServerInter
}
}
// PrincipalClientInterceptor - grpc-интерсептор, который используется для получения данных принципала. В случае, если
// сервис не использует проверку прав 'Principal' к системе, в параметрах передается пустой объект '&PrincipalFactory{}'
func PrincipalClientInterceptor() grpc.UnaryClientInterceptor {
return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
md, ok := metadata.FromOutgoingContext(ctx)
......
......@@ -45,42 +45,42 @@ type OrganizationAccessor interface {
Member(ctx context.Context) members.Role
}
func hasEnvironmentAccess(ctx context.Context, envsrv environments.Environments, role *roles.Role, envID string) bool {
if role == nil || role.SpaceID == "" || envID == "" {
return false
}
if role.AllowManagement {
return true
}
envs := role.Environments
// Если явно не указаны доступные окружения - доступ по умолчанию к окружению master
if len(envs) == 0 {
envs = []string{environments.DefaultEnvironment}
}
for _, ce := range envs {
if envID == ce || util.GlobMatch(envID, ce) {
return true
}
}
e, err := envsrv.Get(WithSystem(ctx), role.SpaceID, envID)
if err != nil || e == nil {
return false
}
aliases := append(e.Aliases, e.ID)
for _, ce := range envs {
for _, al := range aliases {
if al == ce || util.GlobMatch(al, ce) {
return true
}
}
}
return false
}
//func hasEnvironmentAccess(ctx context.Context, envsrv environments.Environments, role *roles.Role, envID string) bool {
// if role == nil || role.SpaceID == "" || envID == "" {
// return false
// }
//
// if role.AllowManagement {
// return true
// }
//
// envs := role.Environments
//
// // Если явно не указаны доступные окружения - доступ по умолчанию к окружению master
// if len(envs) == 0 {
// envs = []string{environments.DefaultEnvironment}
// }
//
// for _, ce := range envs {
// if envID == ce || util.GlobMatch(envID, ce) {
// return true
// }
// }
//
// e, err := envsrv.Get(WithSystem(ctx), role.SpaceID, envID)
// if err != nil || e == nil {
// return false
// }
//
// aliases := append(e.Aliases, e.ID)
//
// for _, ce := range envs {
// for _, al := range aliases {
// if al == ce || util.GlobMatch(al, ce) {
// return true
// }
// }
// }
//
// return false
//}
......@@ -183,7 +183,7 @@ func (u *UserPrincipal) HasSpaceAccess(ctx context.Context, spaceID string) bool
// - Пространство позволяет доступ для не участников (есть роли AnonymousRole/AuthorizedRole/ViewRole)
func (u *UserPrincipal) HasAccess(ctx context.Context, spaceID, orgID string) error {
if !u.IsValid(ctx) {
return services.ErrAccessDenied
return ErrAccessDenied
}
if u.IsSystem(ctx) {
......@@ -211,7 +211,7 @@ func (u *UserPrincipal) HasAccess(ctx context.Context, spaceID, orgID string) er
}
}
return services.ErrAccessDenied
return ErrAccessDenied
}
func (u *UserPrincipal) hasRole(ctx context.Context, spaceID string) (bool, error) {
......@@ -231,9 +231,9 @@ func (u *UserPrincipal) hasRole(ctx context.Context, spaceID string) (bool, erro
if rErr == nil {
return true, nil
}
if errors.Is(cErr, services.ErrNotFound) || errors.Is(rErr, services.ErrNotFound) {
if errors.Is(cErr, ErrNotFound) || errors.Is(rErr, ErrNotFound) {
if sp := u.getSpace(ctx, spaceID); sp == nil {
return false, services.ErrNotFound
return false, ErrNotFound
}
}
......@@ -250,9 +250,9 @@ func (u *UserPrincipal) hasRole(ctx context.Context, spaceID string) (bool, erro
return true, nil
}
if errors.Is(cErr, services.ErrNotFound) || errors.Is(rErr, services.ErrNotFound) {
if errors.Is(cErr, ErrNotFound) || errors.Is(rErr, ErrNotFound) {
if sp := u.getSpace(ctx, spaceID); sp == nil {
return false, services.ErrNotFound
return false, ErrNotFound
}
}
......@@ -306,7 +306,7 @@ func (u *UserPrincipal) Rules(ctx context.Context, spaceID, envID string) permis
return nil
}
if !hasEnvironmentAccess(ctx, u.environments, role, envID) {
if !role.CanAccessEnvironment(WithSystem(ctx), u.environments, spaceID, envID) {
return nil
}
......@@ -331,5 +331,5 @@ func User(ctx context.Context, p Principal) *users.User {
}
func (u *UserPrincipal) HasEnvironmentAccess(ctx context.Context, spaceID, env string) bool {
return hasEnvironmentAccess(ctx, u.environments, u.Role(ctx, spaceID), env)
return u.Role(ctx, spaceID).CanAccessEnvironment(WithSystem(ctx), u.environments, spaceID, env)
}
......@@ -39,27 +39,35 @@ func (r Role) CanAccessEnvironment(ctx context.Context, service environments.Env
return false
}
if r.AllowManagement {
return true
}
// Если явно не указаны доступные окружения - доступ по умолчанию к окружению master
if len(r.Environments) == 0 {
r.Environments = []string{environments.DefaultEnvironment}
}
if data.Contains(envID, r.Environments) {
for _, e := range r.Environments {
if envID == e || data.GlobMatch(envID, e) {
return true
}
}
e, err := service.Get(ctx, spaceID, envID)
if err != nil || e == nil {
env, err := service.Get(ctx, spaceID, envID)
if err != nil || env == nil {
return false
}
aliases := append(e.Aliases, e.ID)
aliases := append(env.Aliases, env.ID)
for _, ce := range r.Environments {
if data.Contains(ce, aliases) {
for _, e := range r.Environments {
for _, a := range aliases {
if a == e || data.GlobMatch(a, e) {
return true
}
}
}
return false
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment