乙個站點上面最基本都會有三種使用者角色,未登入使用者、已登入使用者和管理員。這一次我們就來看看在revel框架下如何進行許可權控制。
因為revel是mvc結構的,每乙個url其實都會對映到乙個具體的controller.action上面,所以許可權控制落到實處就是對action的訪問進行控制。
那麼思路是如下:
1. 有乙個方法能夠判定當前是什麼角色。
2. 有一地方定義了每乙個action的訪問許可權要求。
3. 有乙個方法能夠在呼叫所有action之前被呼叫,而且能夠判定是否還要繼續呼叫action。
我們一項一項來解決。
儲存當前使用者的角色資訊
先定義乙個角色型別如下。
type role int定義個常量,用於在session裡面存放當前使用者的角色型別。const (
anonymousrole role = iota
userrole
adminrole
)
const (然後在處理使用者登陸的方法中在session裡儲存角色資訊。csessionrole = "csessionrole"
)
func (c *account) handlelogin(email, password string) revel.result我們現在可以從session中讀取csessionrole的值來判定當前使用者是什麼角色了。func (c *account) handleadminlogin(account, password string) revel.result
定義action的訪問許可權
在controller層定義乙個map,用於存放action的許可權資訊,如下。
func initauthmap()要注意的是initauthmap需要在controller包的init函式中呼叫,以進行許可權控制初始化。
檢查訪問許可權
revel框架提供的interceptfunc(攔截方法)能夠將乙個方法注入到所有action的呼叫之前或之後,這就給許可權控制留出了空間。
讓我們先定義乙個方法用於檢查許可權。
func checkauthentication(c *revel.controller) revel.result將這個interceptfunc註冊到revel的處理鏈中。//返回nil表示可以接著呼叫後面的action,在這裡就代表有許可權訪問
return nil
}
revel.interceptfunc(checkauthentication, revel.before, revel.all_controllers)好了,乙個簡單的許可權控制系統做好了。這裡只是展現了最基本的概念和構建的思路,掌握了之後,就算面對再複雜的要求也可以通過擴充套件其中的乙個部分去滿足。
另外,在我們的專案山坡網裡,由於authmap定義了超過50個action,很多時候一旦action名字更改了就可能導致許可權控制失效,針對這個問題,可以通過下面方法來解決。
authmap之前是用string做key,改成用reflect.type就好了,註冊的時候這麼寫。
authmap[reflect.typeof((*account.handlelogin)(nil)] = anonymousrole這樣就可以用編譯器幫助檢查錯誤。
最後還得提一句,目前山坡網的go**已經超過兩萬行,且執行良好。revel是個好框架,值得信賴。
Go語言實戰 revel框架教程之快取和Job
所有的 應該都會有乙個非常簡單的需求,首頁一秒之內開啟。滿足的方式主要有兩種 資料記憶體化,把常用的資料全都放到記憶體,定期分批寫入硬碟。相比靜態頁面,這個方法對cpu的要求稍高。好處就不細說了,動態網頁的好處相比大家都耳熟能詳了。山坡網選擇了第二種方案,資料記憶體化。revel本身提供了cache...
Go語言revel環境搭建
在terminal中執行如下命令 ruby e curl fssl brew update brew install go sudo apt get update sudo apt get install go 64bit 32bit 在有許可權的目錄建立乙個資料夾go path,用於golang的...
讀《Go 語言實戰》
英文版書名 go in action william kennedy brian ketelsen eirk st.martin 著2017年3月 第 1 版 go 語言是現代的,快速的,帶有乙個強大的標準庫。內建對併發的支援 使用介面作為 復用的基礎模組。一,go語言介紹 二,快速開始乙個go程式...