-
Notifications
You must be signed in to change notification settings - Fork 12
/
basic.go
84 lines (63 loc) · 1.83 KB
/
basic.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package saas_security_basic
import (
"fmt"
"github.com/appleboy/gin-jwt/v2"
"github.com/loeffel-io/go-saas/database"
"github.com/loeffel-io/go-saas/model"
"golang.org/x/crypto/bcrypt"
"sync"
)
type Basic struct {
Database *saas_database.Database
*sync.RWMutex
}
func (basic *Basic) getDatabase() *saas_database.Database {
basic.RLock()
defer basic.RUnlock()
return basic.Database
}
func (basic *Basic) Login(field string, id string, password string) (*saas_model.User, error) {
var user = &saas_model.User{
RWMutex: new(sync.RWMutex),
}
if err := basic.getDatabase().GetConnection().Where(fmt.Sprintf("%s = ?", field), id).Find(&user).Error; err != nil {
return nil, jwt.ErrFailedAuthentication
}
if bcrypt.CompareHashAndPassword([]byte(*user.GetPassword()), []byte(password)) != nil {
return nil, jwt.ErrFailedAuthentication
}
return user, nil
}
func (basic *Basic) Register(user *saas_model.User) (*saas_model.User, error) {
bcrypted, err := basic.EncryptPassword(*user.GetPassword())
if err != nil {
return nil, err
}
user.SetPassword(string(bcrypted))
if err := basic.getDatabase().GetConnection().Create(&user).Error; err != nil {
return nil, err
}
return user, nil
}
func (basic *Basic) TokenLogin(token string) (*saas_model.User, error) {
var user = &saas_model.User{
RWMutex: new(sync.RWMutex),
}
err := basic.getDatabase().GetConnection().
Preload("Tokens", "token = ?", token).
Joins("JOIN tokens ON tokens.user_id=users.id AND tokens.token = ?", token).
First(&user).
Error
if err != nil {
return nil, err
}
user.Tokens[0].RWMutex = new(sync.RWMutex)
return user, nil
}
func (basic *Basic) EncryptPassword(password string) ([]byte, error) {
bcrypted, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
if err != nil {
return nil, err
}
return bcrypted, nil
}