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是个好框架,值得信赖。
Go语言实战 - revel框架教程之权限控制的更多相关文章
- revel框架教程之权限控制
Go语言实战 - revel框架教程之权限控制 一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构 ...
- Go语言实战 - revel框架教程之用户注册
用户注册.登录和注销是任何一个网站都必然会有的功能,可以说,这是重新造轮子做多的领域,每个做网站的人应该都做过很多遍.见微知著,从这么一个小功能其实就可以看到所使用的web框架中的大部分东西. 今天就 ...
- Go语言实战 - revel框架教程之缓存和Job
所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...
- Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo
由于revel框架本身对于model层的编写没有提供任何指导,所以在设计这部分的时候就有些犹豫,反复斟酌到底怎样才算是最佳实践. 我在做山坡网的时候刚开始也纠结了一下,拿不准mongodb的sessi ...
- Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护
CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...
- revel框架教程之缓存和Job
Go语言实战 - revel框架教程之缓存和Job 所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...
- shiro框架的四中权限控制方式
https://www.cnblogs.com/cocosili/p/7103025.html 一.在自定义的realm中进行权限控制 在applicationContext.xml文件中添加 /a ...
- Yii 框架的Rbac [权限控制]
转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451 1.首先我们要在配置文件的组件(component)里面配置 ...
- shiro框架学习-7- Shiro权限控制注解和编程方式
讲解权限角色控制 @RequiresRoles, @RequiresPermissions等注解的使用和编程式控制 配置文件的方式 使用ShiroConfig 注解方式 @RequiresRoles( ...
随机推荐
- 隐藏进程中的模块绕过IceSword的检测
标 题: [原创] 隐藏进程中的模块绕过IceSword的检测 作 者: xPLK 时 间: 2008-06-19,17:59:11 链 接: http://bbs.pediy.com/showthr ...
- linux查看是什么操作系统是什么命令
https://zhidao.baidu.com/question/361519585968730492.html
- Gulp常用前端流程自动化配置
前言 近期的项目全部由Grunt + LESS 转向改用Gulp + SASS 进行前端开发,也就奔着Gulp那比较好用的自定义函数而来的. 一.package.json文件配置如下: { " ...
- JAVA集合类型详解
一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...
- BZOJ4597: [Shoi2016]随机序列
Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...
- WPF-开机自启
#region 开机自启 /// <summary> /// 开机自启创建 /// </summary> /// <param name="exeName&qu ...
- 《JavaScript Dom编程艺术》(第二版)
第一章<JavaScript简史> 1.JavaScript是一种脚本语言,通常只能通过Web浏览器去完成一些操作而不能像普通意义上的程序那样独立运行,它需要由Web浏览器进行解释和执行. ...
- (转)对博士学位说永别 by 王珢
对博士学位说永别 by 王垠 经过深思熟虑之后,我决定再次“抛弃”我的博士学位.这是我第三次决定离开博士学位,也应该是最后一次了.这应该不是什么惊人的消息,因为我虽然读博士10年了,可是我的目标从来就 ...
- python Django 进阶篇
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- linux配置ftp高级权限
建一个用于管理的ftp高级账号,ftproot,定义它的目录,也就是我们存放项目的地址,所属组www, useradd -d /home/www -g www ftproot www里存放很多项目,我 ...