generated from VLADIMIR/template
clear
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
package roles
|
||||
|
||||
// Роли пользователей системы.
|
||||
const (
|
||||
Admin = "admin"
|
||||
Author = "author"
|
||||
Organizer = "organizer"
|
||||
User = "user"
|
||||
)
|
||||
|
||||
// AllRoles — список всех ролей.
|
||||
var AllRoles = []string{
|
||||
Admin,
|
||||
Author,
|
||||
Organizer,
|
||||
User,
|
||||
}
|
||||
|
||||
// IHasRole — контракт субъекта, у которого можно проверить наличие роли.
|
||||
type IHasRole interface {
|
||||
HasRole(role string) bool
|
||||
}
|
||||
@@ -1,23 +1,7 @@
|
||||
package roles
|
||||
|
||||
const (
|
||||
Admin = "admin"
|
||||
Author = "author"
|
||||
Organizer = "organizer"
|
||||
User = "user"
|
||||
)
|
||||
|
||||
var AllRoles = []string{
|
||||
Admin,
|
||||
Author,
|
||||
Organizer,
|
||||
User,
|
||||
}
|
||||
|
||||
type IHasRole interface {
|
||||
HasRole(role string) bool
|
||||
}
|
||||
|
||||
// HasRole возвращает true, если у субъекта есть роль; администратор
|
||||
// проходит проверку любой роли.
|
||||
func HasRole(claims IHasRole, role string) bool {
|
||||
if claims.HasRole(Admin) {
|
||||
return true
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package roles
|
||||
|
||||
import "slices"
|
||||
|
||||
// subject — реализация IHasRole: субъект с фиксированным набором ролей.
|
||||
type subject struct {
|
||||
roles []string
|
||||
}
|
||||
|
||||
// NewSubject создаёт субъект с заданными ролями (например, для тестов
|
||||
// авторизации или in-memory проверок прав).
|
||||
func NewSubject(roles ...string) IHasRole {
|
||||
return &subject{roles: roles}
|
||||
}
|
||||
|
||||
// HasRole возвращает true, если роль есть в наборе ролей субъекта.
|
||||
func (s *subject) HasRole(role string) bool {
|
||||
return slices.Contains(s.roles, role)
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package roles
|
||||
|
||||
import "testing"
|
||||
|
||||
func Test_subject_HasRole(t *testing.T) {
|
||||
subject := NewSubject(Author, Organizer)
|
||||
|
||||
if !subject.HasRole(Author) {
|
||||
t.Errorf("HasRole(%q) = false, want true", Author)
|
||||
}
|
||||
if !subject.HasRole(Organizer) {
|
||||
t.Errorf("HasRole(%q) = false, want true", Organizer)
|
||||
}
|
||||
if subject.HasRole(Admin) {
|
||||
t.Errorf("HasRole(%q) = true, want false", Admin)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_subject_HasRoleEmpty(t *testing.T) {
|
||||
subject := NewSubject()
|
||||
|
||||
if subject.HasRole(User) {
|
||||
t.Errorf("HasRole(%q) = true, want false для субъекта без ролей", User)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user