這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近想用beego架構想開發一個定時任務管理的系統,發現使用者權限這裡需要一個rabc的功能。我之前一直是PHP開發,用yii已經4年,所以基於yii架構的rabc功能,用go也寫了一個beego架構的外掛程式。目前剛寫完,歡迎大家使用吐槽,後期會在2.0的版本增加菜單和許可權緩衝的功能。。話不多說,來看看目前的功能~~
GRABC外掛程式包括路由、許可權、角色、使用者角色綁定的功能。路由功能會自動掃描controller裡面的方法,然後根據需要將路由分配給許可權,許可權分配給角色,角色指派給使用者。grabc功能簡單實用,在beego架構中安裝只需要不到20行的代碼,即可實現rabc的功能。
安裝:
go get github.com/codyi/grabc
配置:
第一步:在你項目中的資料庫中匯入rabc.sql,產生對應資料表,用於儲存路由,許可權,角色的資料
第二步:在項目中引入grabc庫(可以在項目中的main.go或router.go中引入)
在router.go或main.go中配置如下:
//引入grabc庫import "github.com/codyi/grabc"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的許可權檢查~~
BaseController.go中Prepare方法中配置如下
//註冊當前登入的使用者,注意: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介面//用於定義使用者modeltype IUserModel interface {//使用者列表返回可用使用者的id和姓名//參數:pageIndex 分頁的頁數//參數:pageCount 每頁顯示的使用者數量//傳回值:userList [使用者ID]使用者姓名,使用者列表展示//傳回值:totalNum 全部的使用者數目,用於計算分頁的數量//傳回值:errUserList(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"}}
項目地址:
https://github.com/codyi/grabc
GRABC樣本地址:
https://github.com/codyi/grabc_example
263 次點擊 ∙ 1 贊