mirror of
https://github.com/tiger1103/gfast.git
synced 2026-09-27 12:00:44 +00:00
283 lines
9.0 KiB
Go
283 lines
9.0 KiB
Go
package test
|
|
|
|
import (
|
|
"fmt"
|
|
"gfast/library/adapterUtils"
|
|
"github.com/casbin/casbin/v2"
|
|
"github.com/casbin/casbin/v2/util"
|
|
"github.com/goflyfox/gtoken/gtoken"
|
|
"github.com/gogf/gf/crypto/gaes"
|
|
"github.com/gogf/gf/encoding/gbase64"
|
|
"github.com/gogf/gf/frame/g"
|
|
"github.com/gogf/gf/net/ghttp"
|
|
"github.com/gogf/gf/os/glog"
|
|
"github.com/mojocn/base64Captcha"
|
|
"testing"
|
|
)
|
|
|
|
func TestDemo(t *testing.T) {
|
|
//t.Run("demo1" ,Demo1)
|
|
t.Run("Adapters_test", Adapters)
|
|
//t.Run("CaptchaDemo", CaptchaDemo)
|
|
//t.Run("CaptchaVerify", CaptchaVerify)
|
|
//t.Run("GTokenTest", GTokenTest)
|
|
//t.Run("CbcEncrypt", CbcEncrypt)
|
|
}
|
|
|
|
func HookDemo(t *testing.T) {
|
|
// 基本事件回调使用
|
|
p := "/:name/info/{uid}"
|
|
s := g.Server()
|
|
s.BindHookHandlerByMap(p, map[string]ghttp.HandlerFunc{
|
|
ghttp.HOOK_BEFORE_SERVE: func(r *ghttp.Request) { glog.Println(ghttp.HOOK_BEFORE_SERVE) },
|
|
ghttp.HOOK_AFTER_SERVE: func(r *ghttp.Request) { glog.Println(ghttp.HOOK_AFTER_SERVE) },
|
|
ghttp.HOOK_BEFORE_OUTPUT: func(r *ghttp.Request) { glog.Println(ghttp.HOOK_BEFORE_OUTPUT) },
|
|
ghttp.HOOK_AFTER_OUTPUT: func(r *ghttp.Request) { glog.Println(ghttp.HOOK_AFTER_OUTPUT) },
|
|
})
|
|
s.BindHandler(p, func(r *ghttp.Request) {
|
|
r.Response.Write("用户:", r.Get("name"), ", uid:", r.Get("uid"))
|
|
})
|
|
s.SetPort(8199)
|
|
s.Run()
|
|
}
|
|
|
|
func CbcEncrypt(t *testing.T) {
|
|
b, e := gaes.EncryptCBC([]byte("yxh123456"), []byte("HqmP1KLMuz09Q0Bu"), []byte("HqmP1KLMuz09Q0Bu"))
|
|
if e != nil {
|
|
panic(e)
|
|
}
|
|
fmt.Println(gbase64.EncodeToString(b))
|
|
b, _ = gaes.DecryptCBC(b, []byte("HqmP1KLMuz09Q0Bu"), []byte("HqmP1KLMuz09Q0Bu"))
|
|
fmt.Println(string(b))
|
|
}
|
|
|
|
func Demo1(t *testing.T) {
|
|
e, err := casbin.NewEnforcer("casbin_conf/model.conf", "casbin_conf/policy.csv")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
sub := "alice" // the user that wants to access a resource. 对象
|
|
obj := "data1" // the resource that is going to be accessed. 资源
|
|
act := "write" // the operation that the user performs on the resource. 操作
|
|
ok, err := e.Enforce(sub, obj, act)
|
|
|
|
if err != nil {
|
|
fmt.Println("验证失败", err)
|
|
}
|
|
|
|
if ok == true {
|
|
fmt.Println("权限通过")
|
|
} else {
|
|
fmt.Println("没有权限")
|
|
}
|
|
}
|
|
|
|
func GTokenTest(t *testing.T) {
|
|
// 启动gtoken
|
|
gtoken := >oken.GfToken{
|
|
LoginPath: "/login",
|
|
LoginBeforeFunc: loginFunc,
|
|
LogoutPath: "/user/logout",
|
|
AuthPaths: g.SliceStr{"/system/*"},
|
|
LogoutBeforeFunc: loginOutFunc,
|
|
}
|
|
gtoken.Start()
|
|
s := g.Server()
|
|
s.BindHandler("/system/admin", func(r *ghttp.Request) {
|
|
r.Response.Write("hello admin")
|
|
})
|
|
s.SetPort(8080)
|
|
s.Run()
|
|
}
|
|
|
|
func loginFunc(r *ghttp.Request) (string, interface{}) {
|
|
return "yixiaohu", []g.MapStrStr{{"name": "张三", "age": "18"}, {"name": "李四", "age": "32"}}
|
|
}
|
|
func loginOutFunc(r *ghttp.Request) bool {
|
|
return true
|
|
}
|
|
func demoCodeCaptchaCreate() {
|
|
//config struct for digits
|
|
//数字验证码配置
|
|
/*var configD = base64Captcha.ConfigDigit{
|
|
Height: 80,
|
|
Width: 240,
|
|
MaxSkew: 0.7,
|
|
DotCount: 80,
|
|
CaptchaLen: 5,
|
|
}*/
|
|
//config struct for audio
|
|
//声音验证码配置
|
|
/*var configA = base64Captcha.ConfigAudio{
|
|
CaptchaLen: 6,
|
|
Language: "zh",
|
|
}*/
|
|
//config struct for Character
|
|
//字符,公式,验证码配置
|
|
var configC = base64Captcha.ConfigCharacter{
|
|
Height: 60,
|
|
Width: 240,
|
|
//const CaptchaModeNumber:数字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算术,CaptchaModeNumberAlphabet:数字字母混合.
|
|
Mode: base64Captcha.CaptchaModeNumber,
|
|
ComplexOfNoiseText: base64Captcha.CaptchaComplexLower,
|
|
ComplexOfNoiseDot: base64Captcha.CaptchaComplexLower,
|
|
IsShowHollowLine: false,
|
|
IsShowNoiseDot: false,
|
|
IsShowNoiseText: false,
|
|
IsShowSlimeLine: false,
|
|
IsShowSineLine: false,
|
|
CaptchaLen: 4,
|
|
}
|
|
//创建字符公式验证码.
|
|
//GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
|
|
idKeyC, capC := base64Captcha.GenerateCaptcha("8nM77YhE2xOvU6GMQ33A", configC)
|
|
//以base64编码
|
|
base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC)
|
|
fmt.Println(idKeyC, "\n", base64stringC)
|
|
}
|
|
func CaptchaDemo(t *testing.T) {
|
|
demoCodeCaptchaCreate()
|
|
}
|
|
|
|
func CaptchaVerify(t *testing.T) {
|
|
if base64Captcha.VerifyCaptchaAndIsClear("8nM77YhE2xOvU6GMQ33A", "0870", false) {
|
|
fmt.Println("验证成功")
|
|
} else {
|
|
fmt.Println("验证失败")
|
|
}
|
|
}
|
|
|
|
func Adapters(t *testing.T) {
|
|
a := initAdapter(t, "mysql", "root:123456@tcp(127.0.0.1:3306)/test2")
|
|
testAutoSave(t, a)
|
|
testSaveLoad(t, a)
|
|
|
|
a = initAdapterFormOptions(t, &adapterUtils.Adapter{
|
|
DriverName: "mysql",
|
|
DataSourceName: "root:123456@tcp(127.0.0.1:3306)/test2",
|
|
})
|
|
testAutoSave(t, a)
|
|
testSaveLoad(t, a)
|
|
}
|
|
|
|
func initAdapterFormOptions(t *testing.T, adapter *adapterUtils.Adapter) *adapterUtils.Adapter {
|
|
// Create an adapter
|
|
a, _ := adapterUtils.NewAdapterFromOptions(adapter)
|
|
// Initialize some policy in DB.
|
|
initPolicy(t, a)
|
|
// Now the DB has policy, so we can provide a normal use case.
|
|
// Note: you don't need to look at the above code
|
|
// if you already have a working DB with policy inside.
|
|
|
|
return a
|
|
}
|
|
|
|
func initPolicy(t *testing.T, a *adapterUtils.Adapter) {
|
|
// Because the DB is empty at first,
|
|
// so we need to load the policy from the file adapter (.CSV) first.
|
|
e, err := casbin.NewEnforcer("casbin_conf/rbac_model.conf", "casbin_conf/rbac_policy.csv")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// This is a trick to save the current policy to the DB.
|
|
// We can't call e.SavePolicy() because the adapter in the enforcer is still the file adapter.
|
|
// The current policy means the policy in the Casbin enforcer (aka in memory).
|
|
err = a.SavePolicy(e.GetModel())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Clear the current policy.
|
|
e.ClearPolicy()
|
|
testGetPolicy(t, e, [][]string{})
|
|
|
|
// Load the policy from DB.
|
|
err = a.LoadPolicy(e.GetModel())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}})
|
|
}
|
|
|
|
func testGetPolicy(t *testing.T, e *casbin.Enforcer, res [][]string) {
|
|
myRes := e.GetPolicy()
|
|
glog.Info("Policy: ", myRes)
|
|
|
|
if !util.Array2DEquals(res, myRes) {
|
|
t.Error("Policy: ", myRes, ", supposed to be ", res)
|
|
}
|
|
}
|
|
|
|
func initAdapter(t *testing.T, driverName string, dataSourceName string) *adapterUtils.Adapter {
|
|
// Create an adapter
|
|
a, err := adapterUtils.NewAdapter(driverName, dataSourceName)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Initialize some policy in DB.
|
|
initPolicy(t, a)
|
|
// Now the DB has policy, so we can provide a normal use case.
|
|
// Note: you don't need to look at the above code
|
|
// if you already have a working DB with policy inside.
|
|
|
|
return a
|
|
}
|
|
|
|
func testAutoSave(t *testing.T, a *adapterUtils.Adapter) {
|
|
|
|
// NewEnforcer() will load the policy automatically.
|
|
e, err := casbin.NewEnforcer("casbin_conf/rbac_model.conf", a)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
// AutoSave is enabled by default.
|
|
// Now we disable it.
|
|
e.EnableAutoSave(false)
|
|
|
|
// Because AutoSave is disabled, the policy change only affects the policy in Casbin enforcer,
|
|
// it doesn't affect the policy in the storage.
|
|
e.AddPolicy("alice", "data1", "write")
|
|
// Reload the policy from the storage to see the effect.
|
|
e.LoadPolicy()
|
|
// This is still the original policy.
|
|
testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}})
|
|
|
|
// Now we enable the AutoSave.
|
|
e.EnableAutoSave(true)
|
|
|
|
// Because AutoSave is enabled, the policy change not only affects the policy in Casbin enforcer,
|
|
// but also affects the policy in the storage.
|
|
e.AddPolicy("alice", "data1", "write")
|
|
// Reload the policy from the storage to see the effect.
|
|
e.LoadPolicy()
|
|
// The policy has a new rule: {"alice", "data1", "write"}.
|
|
testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data1", "write"}})
|
|
|
|
// Remove the added rule.
|
|
e.RemovePolicy("alice", "data1", "write")
|
|
e.LoadPolicy()
|
|
testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}})
|
|
|
|
// Remove "data2_admin" related policy rules via a filter.
|
|
// Two rules: {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"} are deleted.
|
|
e.RemoveFilteredPolicy(0, "data2_admin")
|
|
e.LoadPolicy()
|
|
testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}})
|
|
}
|
|
|
|
func testSaveLoad(t *testing.T, a *adapterUtils.Adapter) {
|
|
// Initialize some policy in DB.
|
|
initPolicy(t, a)
|
|
// Note: you don't need to look at the above code
|
|
// if you already have a working DB with policy inside.
|
|
|
|
// Now the DB has policy, so we can provide a normal use case.
|
|
// Create an adapter and an enforcer.
|
|
// NewEnforcer() will load the policy automatically.
|
|
|
|
e, _ := casbin.NewEnforcer("casbin_conf/rbac_model.conf", a)
|
|
testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}})
|
|
}
|