revel框架教程之权限控制
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是个好框架,值得信赖。
30个另类的 404 not found 页面设计
404页面是每个网站必不可少的一部分。我们在网络上能看到很多创意的404错误页面。在这篇文章中,我挑选了30个充满灵感和启发性的404页面设计的例子。Web 设计师们花精力设计一个另类的自定义的404错误页面,使访问者在您的网站上碰到404错误的时候,提示他们浏览替代内容,或者让他们被错误页面逗乐。
Galaxykits

Cartobi

Is It WordPress?

BrowserMedia

Suchowski Media

Wamada

Weekdone

Blueleaf

404 Page by Aaron Snyder

Coolappse

Head-vs-Tails App

Tomy2e

Nicolas Lagarde

dario esteban brozzi

Wise-Digital.com

Klout.com

Juicy Graphics

Testigo

Alberttoledo.com

9gag.com

I-am-tiago.com

Distillers

Batman 3D

Vintage Tube Monitor 404 Error by Samuel Lamaz

1MD

Foundationsix.com

Fordusados.pt

PBS – 404 Error Page

404 and 500 Error Page

Error Pages Design

您可能感兴趣的相关文章
revel框架教程之权限控制的更多相关文章
- Go语言实战 - revel框架教程之权限控制
一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...
- revel框架教程之缓存和Job
Go语言实战 - revel框架教程之缓存和Job 所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...
- shiro框架的四中权限控制方式
https://www.cnblogs.com/cocosili/p/7103025.html 一.在自定义的realm中进行权限控制 在applicationContext.xml文件中添加 /a ...
- Go语言实战 - revel框架教程之用户注册
用户注册.登录和注销是任何一个网站都必然会有的功能,可以说,这是重新造轮子做多的领域,每个做网站的人应该都做过很多遍.见微知著,从这么一个小功能其实就可以看到所使用的web框架中的大部分东西. 今天就 ...
- Yii 框架的Rbac [权限控制]
转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451 1.首先我们要在配置文件的组件(component)里面配置 ...
- shiro框架学习-7- Shiro权限控制注解和编程方式
讲解权限角色控制 @RequiresRoles, @RequiresPermissions等注解的使用和编程式控制 配置文件的方式 使用ShiroConfig 注解方式 @RequiresRoles( ...
- Go语言实战 - revel框架教程之缓存和Job
所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...
- JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理
1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...
- yii2 rbac权限控制之菜单menu详细教程
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
随机推荐
- 在面对变化,撇开NO
参观后转到供应商,看到自己的生产线流水线半自己的钣金生产线举措.这就是我一直想厂提高生产现场的想法,因为通常当我看到工作人员努力工作和繁忙的生产,只见废现场,线解决方式时,有点莫名的兴奋. 幸亏是一家 ...
- F4107Usart数据处理程序
解决:Cortex-M4上,usart自己主动发送数据计划. 1. usart快速突破.数据还没有被处理.usart中断会把盖掉的数据不被处理. 数据丢失. 2.此过程需要main处理4一个usart ...
- ASP.NET 5:依赖注入
ASP.NET 5:依赖注入 1.背景 如果某个具体的(或类)对象被客户程序所依赖,通常把它们抽象成抽象类或接口.简单说,客户程序摆脱所依赖的具体类型,称之为面向接口编程. 那么问题来了?如何选择客户 ...
- 左右lcm,gcd一些性质
两个整数a,b 他们的最大公约数为n 最小公倍数为m 则有 a,b都能分解为有限个素数的积 12 = 2^2 * 3^1 * 5^0 , 30 = 2^1 * 3^1 ...
- 项目管理实践 -- 健身小管家(Fitness housekeeper)的管理
最近在网上看到一篇文章<王石:我每天都强迫自己做的一件事>,[http://blog.sina.com.cn/s/blog_4dfc1c330102v0d0.html] 原始链接不详. ...
- Android adb端口转发调试助手Packet Sender
相信大家做过安卓开发或者安卓自动化测试开发的都离不开adb这个Android Debug Bridge这个工具,该工具有个很重要的功能就是端口转发.比如你在目标安卓机器端建立了一个服务来处理获取当前界 ...
- 浅谈 js eval作用域
原文:浅谈 js eval作用域 就简单聊下如何全局 eval 一个代码. var x = 1; (function () { eval('var x = 123;'); })(); console. ...
- Angular指令(一)
Angular开发者手册重点翻译之指令(一) 创建自定义的指令 这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它. 什么是指令 在高的层面上讲,指令是DOM元素中的 ...
- Android学习笔记:Home Screen Widgets(1):大约Widget
什么是Home Screen Widgets Home screen Widget即称为小工具或者中文小工具,是显示在主页上的views,通过后台进程更新view的数据. Android由AppWid ...
- C#-利用ZPL语言完毕条形码的生成和打印
近期由于公司项目的须要,研究了一项对我来说算是新的技术-条形码的生成和打印.由于之前没有接触过这方面的知识,所以刚開始还有点小迷茫和小兴奋,只是一步一步来,问题总会解决的.如今来总结一下做条形码 ...