GRABC beego框架的RABC外掛

codyi發表於2017-12-11

最近寫的一個許可權管理外掛,歡迎大家來吐槽~~

GRABC

GRABC 是一個beego許可權管理外掛,外掛分為路由、許可權、角色。將路由分配給許可權,許可權授給角色,角色授給使用者~~

安裝

go get github.com/codyi/grabc

配置

第一步:在你專案中的資料庫中匯入rabc.sql,生成對應資料表

第二步:在專案中引入grabc庫(可以在專案中的main.go或router.go中引入)

//引入grabc庫
import "github.com/codyi/grabc"

引入之後,在引入的router.go或main.go中新增如下配置

func init() {
    //將路由註冊到grabc,用於反射出對應的網址
    grabc.RegisterController(& controllers.SiteController{})
    grabc.RegisterController(&controllers.UserController{})
    //註冊使用者系統模型到grabc,用於使用者ID和grabc外掛繫結
    //注意:註冊的這個使用者模型,需要實現IUserModel中的方法
    grabc.RegisterUserModel(&models.User{})
    //增加忽律許可權檢查的頁面
    grabc.AppendIgnoreRoute("site", "login")
    //403頁面地址註冊到grabc中,用於grabc外掛禁止許可權的頁面跳轉
    grabc.Http_403("/site/nopermission")
    //設定模板,為了讓grabc更具有通用性,可以設定模板
    //目前設定模板只支援傳入模板的內容
    grabc.SetLayout(libs.Grabc_layout, nil)
}

新增好上面的配置之後,剩下就是在controller中增加許可權判了,個人建議做一個BaseController,然後每個controller都繼承這個base,然後在BaseController中的Prepare方法中增加grabc的許可權檢查~~

//註冊當前登入的使用者,注意:user需要繼承IUserIdentify介面

grabc.RegisterIdentify(user)

if !grabc.CheckAccess(this.controllerName, this.actionName) {
    this.redirect(this.URLFor("SiteController.NoPermission"))
}

到此grabc的功能都加完了,是不是很簡單~~~

注意:增加完許可權判斷之後,會發現很多頁面都不能訪問了,那麼就在忽律許可權中增加如下配置

grabc.AppendIgnoreRoute("*", "*")

以上配置將會忽律所有的許可權檢查,這時候需要去/route/index中增加路由,然後新增許可權,角色和使用者分配,都配置好之後,就可以將grabc.AppendIgnoreRoute("*", "*")程式碼刪掉,然後重啟專案~~許可權起作用了

介面說明

IUserModel介面

//用於定義使用者model
type IUserModel interface {
    //使用者列表返回可用使用者的id和姓名
    //引數:pageIndex 分頁的頁數
    //引數:pageCount 每頁顯示的使用者數量
    //返回值:userList [使用者ID]使用者姓名,使用者列表展示
    //返回值:totalNum 全部的使用者數目,用於計算分頁的數量
    //返回值:err
    UserList(pageIndex, pageCount int) (userList map[int]string, totalNum int, err error)
    //根據使用者ID獲取使用者姓名
    FindNameById(id int) string 
}

IUserIdentify介面
type IUserIdentify interface {
    GetId() int //返回當前登入使用者的ID
}

注意

grabc對註冊的控制器會進行反射,然後獲取每個controller的名稱和controller內的公共方法,由於每個controller都繼承了beego.Controller,在獲取controller下的方法名稱時,會將beego.Controller繼承的方法也會獲取到,所以目前還不能區分出方法名到底是beego和使用者自己定義的,所以grabc將beego繼承的方法都進行了忽律,如果在route掃描中,沒有找到自定義的方法,可以在controller中增加如下方法,進行方法返回~~

func (this *SiteController) RABCMethods() []string {
    return []string{"Get", "Post"}
}

grabc的詳細例子:github.com/codyi/grabc_example

Image text Image text Image text Image text

相關文章