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框架教程之权限控制的更多相关文章

  1. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...

  2. revel框架教程之缓存和Job

    Go语言实战 - revel框架教程之缓存和Job   所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...

  3. shiro框架的四中权限控制方式

    https://www.cnblogs.com/cocosili/p/7103025.html 一.在自定义的realm中进行权限控制 在applicationContext.xml文件中添加  /a ...

  4. Go语言实战 - revel框架教程之用户注册

    用户注册.登录和注销是任何一个网站都必然会有的功能,可以说,这是重新造轮子做多的领域,每个做网站的人应该都做过很多遍.见微知著,从这么一个小功能其实就可以看到所使用的web框架中的大部分东西. 今天就 ...

  5. Yii 框架的Rbac [权限控制]

    转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451 1.首先我们要在配置文件的组件(component)里面配置 ...

  6. shiro框架学习-7- Shiro权限控制注解和编程方式

    讲解权限角色控制 @RequiresRoles, @RequiresPermissions等注解的使用和编程式控制 配置文件的方式 使用ShiroConfig 注解方式 @RequiresRoles( ...

  7. Go语言实战 - revel框架教程之缓存和Job

    所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...

  8. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

  9. yii2 rbac权限控制之菜单menu详细教程

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

随机推荐

  1. 编译 & 预处理

    编译(compilation , compile) 1.利用编译程序从源语言编写的源程序产生目标程序的过程. 2.用编译程序产生目标程序的动作. 编译就是把高级语言变成计算机可以识别的2进制语言,计算 ...

  2. Android实现“是否退出”对话框和“带图标的列表”对话框

    今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...

  3. 为WebBrowser的WEB页的Document注册事件的问题

    原文:为WebBrowser的WEB页的Document注册事件的问题 当使用WebBrowser,并对其装载的Web页建立Document的事件后,WebBrowser里的页面元素都变得难于操作了, ...

  4. 健身小管家--android app源码

    把做了近一个月的android程序源码放出来,里面包括但不限于如下内容: 1. 简单的android项目结构 2. 通用的adapter,不再为每一个ListView都写一个adapter,只要用此一 ...

  5. python元类分析

    刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下..不知道这是个啥东西... 用下面几个定义来说明吧: (1)Python中,类也是对象..仅仅只是这样的对象比較的特殊,他用于创建别的 ...

  6. Bootstrap transition.js 插件

    Bootstrap transition.js 插件详解   Bootstrap 自带的 JavaScript 插件的动画效果几乎都是使用 CSS 过渡实现的,而其中的 transition.js 就 ...

  7. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  8. JS字符串数字互转

    JS是一种弱类型的脚本语言,为变量赋值是会自动转换为相应的类型,例如: var a = 1; alert(a + 1);//结果为2 自动识别为数字类型进行数学运算 var b = '1'; aler ...

  9. Android多媒体-MediaRecorder 录制音视频

    不多说,直接上代码,有具体凝视 MyAudioRecord.java import java.io.File; import java.io.IOException; import android.a ...

  10. 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究

    原文:查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 -理解性能疑点 1      引言 内容来自http://www.so ...