This commit is contained in:
2026-08-21 00:09:32 +07:00
parent 7656100fe6
commit a2cadf6eca
20 changed files with 320 additions and 94 deletions
+22
View File
@@ -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
}
+2 -18
View File
@@ -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
+19
View File
@@ -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)
}
+25
View File
@@ -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)
}
}