feat: add simple auth api

This commit is contained in:
weloe
2023-05-10 16:00:09 +08:00
parent a51ba879a1
commit a89c28076a
8 changed files with 157 additions and 0 deletions

5
auth/acl_interface.go Normal file
View File

@@ -0,0 +1,5 @@
package auth
type ACL interface {
GetPermission(id string) []string
}

6
auth/auth_interface.go Normal file
View File

@@ -0,0 +1,6 @@
package auth
type Manager interface {
ACL
RBAC
}

5
auth/rbac_interface.go Normal file
View File

@@ -0,0 +1,5 @@
package auth
type RBAC interface {
GetRole(id string) []string
}

View File

@@ -23,6 +23,7 @@ type Enforcer struct {
adapter persist.Adapter
watcher persist.Watcher
logger log.Logger
authManager interface{}
}
func NewDefaultAdapter() persist.Adapter {

51
enforcer_auth_api.go Normal file
View File

@@ -0,0 +1,51 @@
package token_go
import (
"errors"
"fmt"
"github.com/weloe/token-go/auth"
"github.com/weloe/token-go/ctx"
"github.com/weloe/token-go/util"
)
func (e *Enforcer) SetAuth(manager interface{}) {
e.authManager = manager
}
func (e *Enforcer) CheckRole(ctx ctx.Context, role string) error {
if e.authManager == nil {
return errors.New("authManager is nil")
}
rbac, ok := e.authManager.(auth.RBAC)
if !ok {
return errors.New("authManager doesn't implement RBAC interface")
}
id, err := e.GetLoginId(ctx)
if err != nil {
return err
}
roles := rbac.GetRole(id)
if util.HasStr(roles, role) {
return nil
}
return fmt.Errorf("id %v doesn't has role %v", id, role)
}
func (e *Enforcer) CheckPermission(ctx ctx.Context, permission string) error {
if e.authManager == nil {
return errors.New("authManager is nil")
}
acl, ok := e.authManager.(auth.ACL)
if !ok {
return errors.New("authManager doesn't implement ACL interface")
}
id, err := e.GetLoginId(ctx)
if err != nil {
return err
}
permissions := acl.GetPermission(id)
if util.HasStr(permissions, permission) {
return nil
}
return fmt.Errorf("id %v doesn't has permission %v", id, permission)
}

76
enforcer_auth_api_test.go Normal file
View File

@@ -0,0 +1,76 @@
package token_go
import (
"github.com/weloe/token-go/model"
"testing"
)
type MockRbacAuth struct {
}
func (m *MockRbacAuth) GetRole(id string) []string {
var arr = make([]string, 2)
arr[1] = "user"
return arr
}
type MockAclAuth struct {
}
func (m *MockAclAuth) GetPermission(id string) []string {
var arr = make([]string, 2)
arr[1] = "user::get"
return arr
}
func TestEnforcer_GetRole(t *testing.T) {
err, enforcer, ctx := NewTestEnforcer(t)
if err != nil {
t.Errorf("NewTestEnforcer() failed: %v", err)
}
m := &MockRbacAuth{}
enforcer.SetAuth(m)
loginModel := model.DefaultLoginModel()
loginModel.Token = "233"
_, err = enforcer.LoginByModel("id", loginModel, ctx)
if err != nil {
t.Errorf("Login() failed: %v", err)
}
err = enforcer.CheckRole(ctx, "user")
if err != nil {
t.Errorf("CheckRole() failed: %v", err)
}
err = enforcer.CheckPermission(ctx, "user::get")
if err == nil {
t.Errorf("CheckRole() failed")
}
t.Logf("CheckPermission() return %v", err)
}
func TestEnforcer_CheckPermission(t *testing.T) {
err, enforcer, ctx := NewTestEnforcer(t)
if err != nil {
t.Errorf("NewTestEnforcer() failed: %v", err)
}
m := &MockAclAuth{}
enforcer.SetAuth(m)
loginModel := model.DefaultLoginModel()
loginModel.Token = "233"
_, err = enforcer.LoginByModel("id", loginModel, ctx)
if err != nil {
t.Errorf("Login() failed: %v", err)
}
err = enforcer.CheckRole(ctx, "user")
if err == nil {
t.Errorf("CheckRole() failed")
}
t.Logf("CheckRole() return %v", err)
err = enforcer.CheckPermission(ctx, "user::get")
if err != nil {
t.Errorf("CheckRole() failed: %v", err)
}
}

View File

@@ -26,6 +26,10 @@ type IEnforcer interface {
CheckLogin(ctx ctx.Context) error
SetAuth(manager interface{})
CheckRole(ctx ctx.Context, role string) error
CheckPermission(ctx ctx.Context, permission string) error
SetType(t string)
GetType() string
GetAdapter() persist.Adapter

View File

@@ -8,3 +8,12 @@ func HasNil(arr []interface{}) bool {
}
return false
}
func HasStr(arr []string, str string) bool {
for _, s := range arr {
if s == str {
return true
}
}
return false
}