reprogl

Форк
0
/
identity.go 
85 строк · 1.3 Кб
1
package security
2

3
import (
4
	"errors"
5

6
	"xelbot.com/reprogl/models"
7
)
8

9
type Identity struct {
10
	ID       int    `json:"i,omitempty"`
11
	Username string `json:"u,omitempty"`
12
	Role     Role   `json:"r,omitempty"`
13
}
14

15
type IdentityAware interface {
16
	SetIdentity(Identity)
17
	HasIdentity() bool
18
	IsAdmin() bool
19
}
20

21
type Role uint8
22

23
const (
24
	Guest = iota
25
	User
26
	Admin
27
)
28

29
var (
30
	SerializeRoleError   = errors.New("security: serialize unknown role")
31
	DeserializeRoleError = errors.New("security: unserialize unknown role")
32
)
33

34
func CreateIdentity(user *models.LoggedUser) Identity {
35
	var role Role
36
	if user.Role == "admin" {
37
		role = Admin
38
	} else {
39
		role = User
40
	}
41

42
	return Identity{
43
		ID:       user.ID,
44
		Username: user.Username,
45
		Role:     role,
46
	}
47
}
48

49
func (i Identity) IsZero() bool {
50
	return i.ID == 0
51
}
52

53
func (i Identity) IsAdmin() bool {
54
	return i.Role == Admin
55
}
56

57
func (r Role) MarshalText() (text []byte, err error) {
58
	switch r {
59
	case Admin:
60
		text = []byte("admin")
61
	case User:
62
		text = []byte("user")
63
	case Guest:
64
		text = []byte{}
65
	default:
66
		err = SerializeRoleError
67
	}
68

69
	return
70
}
71

72
func (r *Role) UnmarshalText(text []byte) error {
73
	switch string(text) {
74
	case "admin":
75
		*r = Admin
76
	case "user":
77
		*r = User
78
	case "":
79
		*r = Guest
80
	default:
81
		return DeserializeRoleError
82
	}
83

84
	return nil
85
}
86

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.