在go中简单使用casbin
注意,本例是简单讲解casbin的作用,并非详细文档,详细文档可查看官方文章。

首先创建2个文件:auth_model.conf和policy.csv
auth_model.conf
[request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [policy_effect] e = some(where (p.eft == allow)) [matchers] m = r.sub == p.sub && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")
policy.csv
p, admin, /*, * p, anonymous, /login, * p, member, /logout, * p, member, /member/*, *
上述2个文件的内容是casbin的核心,说出了casbin的作用:即规定了某某角色,对某某资源,具有某某权限。
单独拿HTTP场景来说:
sub代表 用户角色;
obj代表 用户想访问的路径;
act代表 请求方法(GET或POST等);
比如上面的第一行,admin对任意路径(/*),具有所有权限(*)。
而匿名角色只能访问登录页面(/login)。
会员角色对/member/下的任意路径,既可以发送GET,也可以发送POST。

main.go
package main
import (
	"fmt"
	"github.com/casbin/casbin/v2"
	"log"
	"net/http"
)
func authorizer(e *casbin.Enforcer) func(next http.Handler) http.Handler {
	return func(next http.Handler) http.Handler {
		fn := func(w http.ResponseWriter, r *http.Request) {
			url := r.URL.Path
			queries := r.URL.Query()
			username := queries.Get("user")
			if username == "" {
				username = "anonymous"
			}
			act := r.Method
			// 验证
			ok, err := e.Enforce(username, url, act)
			if err != nil {}
			if ok == true {
				next.ServeHTTP(w, r)
			} else {
				w.WriteHeader(http.StatusForbidden)
				fmt.Fprint(w, "你没有权限访问这个地方")
			}
		}
		return http.HandlerFunc(fn)
	}
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "这是首页")
}
func memberHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "这是会员页")
}
func main() {
	authEnforcer, err := casbin.NewEnforcer("./auth_model.conf", "./policy.csv")
	if err != nil {
		log.Fatal(err)
	}
	router := http.NewServeMux()
	router.HandleFunc("/", indexHandler)
	router.HandleFunc("/member/", memberHandler)
	log.Fatal(http.ListenAndServe(":8080", authorizer(authEnforcer)(router)))
}
最后进行测试
由于只是简化测试,因此用url参数来模拟用户


因为我们在policy.csv中,没有定义member与/的关系,因此在验证的使用,没有通过。

 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号