feat: add Casbin CLI API to Casdoor (#3351)

This commit is contained in:
ZhaoYP 2001 2024-11-15 16:10:22 +08:00 committed by GitHub
parent af01c4226a
commit b0fa3fc484
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 71 additions and 0 deletions

View File

@ -17,7 +17,12 @@ package controllers
import (
"encoding/json"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
fileadapter "github.com/casbin/casbin/v2/persist/file-adapter"
"github.com/casdoor/casdoor/object"
"github.com/casdoor/casdoor/util"
)
@ -327,3 +332,68 @@ func (c *ApiController) GetAllRoles() {
c.ResponseOk(roles)
}
// CasbinCli
// @Title CasbinCli
// @Tag Enforcer API
// @Description Call casbin-go-cli
// @Param enforcerId query string false "enforcer id"
// @Success 200 {object} controllers.Response The Response object
// @router /casbin-cli [get]
func (c *ApiController) CasbinCli() {
enforcerId := c.Input().Get("enforcerId")
command := c.Input().Get("command")
args := c.Input().Get("args")
cliPath, err := filepath.Abs("casbin-go-cli")
if err != nil {
c.ResponseError(err.Error())
return
}
tmpDir := "./tmp"
modelPath := filepath.Join(tmpDir, "tmpModel.conf")
policyPath := filepath.Join(tmpDir, "tmpPolicy.csv")
if _, err := os.Stat(tmpDir); os.IsNotExist(err) {
err = os.Mkdir(tmpDir, os.ModePerm)
if err != nil {
c.ResponseError(err.Error())
return
}
}
inputArgs := []string{command, "-m", modelPath, "-p", policyPath}
if args != "" {
inputArgs = append(inputArgs, strings.Split(args, " ")...)
}
enforcer, err := object.GetInitializedEnforcer(enforcerId)
if err != nil {
c.ResponseError(err.Error())
return
}
if enforcer == nil {
c.ResponseError(fmt.Sprintf(c.T("enforcer:The enforcer: \"%s\" doesn't exist"), enforcerId))
return
}
util.WriteStringToPath(enforcer.GetModel().ToText(), modelPath)
adapter := fileadapter.NewAdapter(policyPath)
enforcer.SetAdapter(adapter)
err = enforcer.SavePolicy()
if err != nil {
c.ResponseError(err.Error())
return
}
casbinCli := exec.Command(cliPath, inputArgs...)
output, err := casbinCli.CombinedOutput()
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(string(output))
}

View File

@ -173,6 +173,7 @@ func initAPI() {
beego.Router("/api/get-all-objects", &controllers.ApiController{}, "GET:GetAllObjects")
beego.Router("/api/get-all-actions", &controllers.ApiController{}, "GET:GetAllActions")
beego.Router("/api/get-all-roles", &controllers.ApiController{}, "GET:GetAllRoles")
beego.Router("/api/casbin-cli", &controllers.ApiController{}, "GET:CasbinCli")
beego.Router("/api/get-sessions", &controllers.ApiController{}, "GET:GetSessions")
beego.Router("/api/get-session", &controllers.ApiController{}, "GET:GetSingleSession")