background image

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)