| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- 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"}})
- }
|