mirror of
https://github.com/weloe/token-go.git
synced 2025-10-04 23:22:41 +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
|
adapter persist.Adapter
|
||||||
watcher persist.Watcher
|
watcher persist.Watcher
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
|
authManager interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDefaultAdapter() persist.Adapter {
|
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
|
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)
|
SetType(t string)
|
||||||
GetType() string
|
GetType() string
|
||||||
GetAdapter() persist.Adapter
|
GetAdapter() persist.Adapter
|
||||||
|
@@ -8,3 +8,12 @@ func HasNil(arr []interface{}) bool {
|
|||||||
}
|
}
|
||||||
return false
|
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