package casbins
|
|
|
|
import (
|
|
"SSW_WebPlatform/conf"
|
|
"SSW_WebPlatform/utils"
|
|
"SSW_WebPlatform/web/middleware/glog"
|
|
"SSW_WebPlatform/web/middleware/jwts"
|
|
"SSW_WebPlatform/web/supports"
|
|
"fmt"
|
|
"github.com/casbin/casbin/v2"
|
|
xormadapter "github.com/casbin/xorm-adapter/v2"
|
|
_ "github.com/denisenkom/go-mssqldb"
|
|
"github.com/kataras/iris/v12"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
// 获取Enforcer
|
|
func NewCasbin() (*casbin.Enforcer, error) {
|
|
|
|
c := conf.MasterDbConfig
|
|
driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8",
|
|
c.User, c.Pwd, c.Host, c.Port, c.DbName)
|
|
|
|
a, err := xormadapter.NewAdapter(conf.DriverName, driveSource, true)
|
|
if err != nil {
|
|
glog.InfoExtln("casbins数据库连接错误", "err:", err)
|
|
return nil, err
|
|
}
|
|
path, _ := utils.GetCurrentPath("conf/rbac_model.conf")
|
|
e, err := casbin.NewEnforcer(path, a)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := e.LoadPolicy(); err == nil {
|
|
return e, err
|
|
} else {
|
|
fmt.Printf("casbin rbac_model or policy init error, message: %v", err)
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
// ServeHTTP is the iris compatible casbins handler which should be passed to specific routes or parties.
|
|
// Usage:
|
|
// [...]
|
|
// app.Get("/dataset1/resource1", casbinMiddleware.ServeHTTP, myHandler)
|
|
// [...]
|
|
func CheckPermissions(ctx iris.Context) bool {
|
|
user, ok := jwts.ParseToken(ctx)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
// 去除空格
|
|
//uid := strings.Replace(user.Userid, " ", "", -1)
|
|
uid := strings.TrimSpace(user.Role)
|
|
e, err := NewCasbin()
|
|
if err != nil {
|
|
supports.Unauthorized(ctx, supports.PermissionsLess, nil)
|
|
ctx.StopExecution()
|
|
return false
|
|
}
|
|
ok, err = e.Enforce(uid, ctx.Path(), ctx.Method())
|
|
log.Println("----------------", uid, ctx.Path(), ctx.Method())
|
|
log.Println(ok)
|
|
if err != nil {
|
|
log.Printf("casbin权限控制错误: %v", err)
|
|
}
|
|
if !ok {
|
|
supports.Unauthorized(ctx, supports.PermissionsLess, nil)
|
|
ctx.StopExecution()
|
|
return false
|
|
}
|
|
|
|
return true
|
|
//ctx.Next()
|
|
}
|
|
|
|
// Wrapper is the router wrapper, prefer this method if you want to use casbins to your entire iris application.
|
|
// Usage:
|
|
// [...]
|
|
// app.WrapRouter(casbinMiddleware.Wrapper())
|
|
// app.Get("/dataset1/resource1", myHandler)
|
|
// [...]
|
|
func Wrapper() func(w http.ResponseWriter, r *http.Request, router http.HandlerFunc) {
|
|
return func(w http.ResponseWriter, r *http.Request, router http.HandlerFunc) {
|
|
//if !c.Check(r) {
|
|
// w.WriteHeader(http.StatusForbidden)
|
|
// w.Write([]byte("403 Forbidden"))
|
|
// return
|
|
//}
|
|
router(w, r)
|
|
}
|
|
}
|