Skip to content

Commit

Permalink
feat: add Casbin CLI API to Casdoor (casdoor#3351)
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhaoYP-2001 authored Nov 15, 2024
1 parent af01c42 commit b0fa3fc
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
70 changes: 70 additions & 0 deletions controllers/casbin_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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))
}
1 change: 1 addition & 0 deletions routers/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit b0fa3fc

Please sign in to comment.