<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Go語言實戰 - revel框架教程之權限控制

      一個站點上面最基本都會有三種用戶角色,未登錄用戶、已登錄用戶和管理員。這一次我們就來看看在revel框架下如何進行權限控制。

      因為revel是MVC結構的,每一個url其實都會映射到一個具體的Controller.Action上面,所以權限控制落到實處就是對Action的訪問進行控制。

      那么思路是如下:

      1. 有一個方法能夠判定當前是什么角色。

      2. 有一地方定義了每一個Action的訪問權限要求。

      3. 有一個方法能夠在調用所有Action之前被調用,而且能夠判定是否還要繼續調用Action。

      我們一項一項來解決。

      存儲當前用戶的角色信息

      先定義一個角色類型如下。

      type Role int

      const (
        AnonymousRole Role = iota
        UserRole
        AdminRole
      )

       定義個常量,用于在session里面存放當前用戶的角色類型。

      const (
        CSessionRole = "CSessionRole"
      )

      然后在處理用戶登陸的方法中在session里保存角色信息。

      func (c *Account) HandleLogin(email, password string) revel.Result {
        //在這里處理登陸邏輯

        c.Session[CSessionRole] = UserRole

        //在這里處理跳轉和頁面渲染
      }

      func (c *Account) HandleAdminLogin(account, password string) revel.Result {
        //在這里處理登陸邏輯

        c.Session[CSessionRole] = AdminRole

        //在這里處理跳轉和頁面渲染
      }

      我們現在可以從session中讀取CSessionRole的值來判定當前用戶是什么角色了。

      定義Action的訪問權限

      在Controller層定義一個map,用于存放action的權限信息,如下。

      func initAuthMap() {
        authMap = make(map[string]Role)
        authMap["account.login"] = AnonymousRole
        authMap["account.logout"] = UserRole
        authMap["admin.index"] = AdminRole
      }

      要注意的是initAuthMap需要在Controller包的init函數中調用,以進行權限控制初始化。

      檢查訪問權限

      revel框架提供的InterceptFunc(攔截方法)能夠將一個方法注入到所有Action的調用之前或之后,這就給權限控制留出了空間。

      讓我們先定義一個方法用于檢查權限。

      func checkAuthentication(c *revel.Controller) revel.Result {
        //獲取當前登陸用戶的角色信息
        userRole, isExists := c.Session[util.CSessionRole]
        if !isExists {
          userRole = AnonymousRole
        }

        //獲取緊接著要調用的Action的名稱
        action := strings.ToLower(c.Action)
        //獲取相關action的權限定義
        if requiredRole, isExists = authMap[action]; isExists {
          //判斷權限,如果權限要求不相符
          if requiredRole != userRole {
            //跳轉到首頁
            return c.Redirect((*Application).Index)
          }
        }

        //返回nil表示可以接著調用后面的Action,在這里就代表有權限訪問
        return nil
      }

      將這個InterceptFunc注冊到revel的處理鏈中。

      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是個好框架,值得信賴。

      posted @ 2013-08-13 14:03  AllenDang  閱讀(3368)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产乱啊有帅gv小太正| 天全县| 国产成人一卡2卡3卡四卡视频| 欧洲熟妇熟女久久精品综合| 国产精品久久久天天影视香蕉 | 你懂的亚洲一区二区三区| 动漫av网站免费观看| 中文字幕乱码无码人妻系列蜜桃| 亚洲欧美精品一中文字幕| 国产精品乱一区二区三区| 国产无遮挡真人免费视频| 亚洲色最新高清AV网站| 措勤县| 东京热无码国产精品| 成人特黄A级毛片免费视频| 国产精品无码a∨麻豆| 亚洲一二三四区中文字幕| 欧美交a欧美精品喷水| 国产初高中生视频在线观看 | 精品无码成人久久久久久| 亚洲综合色一区二区三区| 影音先锋AV成人资源站在线播放| 亚洲日韩久热中文字幕| 色综合五月伊人六月丁香| 十八禁午夜福利免费网站| 山西省| 国产成人亚洲精品成人区| 人妻蜜臀久久av不卡| 崇左市| 亚洲色欲在线播放一区| 久久99精品久久99日本| 成人3d动漫一区二区三区| 中文字幕第一页国产| 国产蜜臀av在线一区二区| 国产极品精品自在线不卡| 亚洲成年av天堂动漫网站| 亚洲综合在线一区二区三区| 成人特黄A级毛片免费视频| 亚洲综合成人av在线| 国产成人精品2021欧美日韩| 日本公与熄乱理在线播放|