mirror of
https://github.com/weloe/token-go.git
synced 2025-09-27 11:52:12 +08:00
feat: add simple auth api
This commit is contained in:
5
auth/acl_interface.go
Normal file
5
auth/acl_interface.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package auth
|
||||
|
||||
type ACL interface {
|
||||
GetPermission(id string) []string
|
||||
}
|
6
auth/auth_interface.go
Normal file
6
auth/auth_interface.go
Normal file
@@ -0,0 +1,6 @@
|
||||
package auth
|
||||
|
||||
type Manager interface {
|
||||
ACL
|
||||
RBAC
|
||||
}
|
5
auth/rbac_interface.go
Normal file
5
auth/rbac_interface.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package auth
|
||||
|
||||
type RBAC interface {
|
||||
GetRole(id string) []string
|
||||
}
|
@@ -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
51
enforcer_auth_api.go
Normal 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
76
enforcer_auth_api_test.go
Normal 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)
|
||||
}
|
||||
}
|
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user