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)