Backbone Views的声明性授权(权限)

时间:2013-01-31 18:24:04

标签: javascript templates backbone.js cancan declarative

序: 来自Rails社区的任何人都可能熟悉服务器端的cancan,用于声明模型操作的授权。 IE浏览器。可以?(:阅读,项目)

背景:但是,在前端的UI层中,我没有找到任何提供相同类型抽象的东西来处理用户看到的内容以及他们有权做什么(显然也总是有后端身份验证层) 。例如,您是否向用户显示了一个按钮?我们是否包含'contenteditable'元素属性?如果用户点击“赞”,我们是否会尝试注册,或者我们是否使用登录对话框进行了展示?

问题:有没有人知道处理此类UI问题的框架/工具/库/最佳实践?

跟进:问题是在视图中还是在模板中进行评估?这是模板语言的一个特征还是我们传递给模板的一组布尔变量?

除了: 我有一个关于cancan仿制工具的想法,其中方法签名就像App.can('like',project,user),其中project和user是BB模型对象。但问题可能是用户可能在任何给定对象上执行的不同操作的数量。 IE浏览器。比如项目,编辑项目,评论项目,邀请朋友加入项目等等。其中一些可以简化为RESTful操作,但我认为大多数人会同意UI提供更多类型的操作。

2 个答案:

答案 0 :(得分:2)

我们在项目中遇到了相同的情况,根据给予用户的权限,页面中的所有内容都应该显示和隐藏,这是我提出的解决方案。

您需要先在用户中保存权限并在客户端加载;然后你可以按如下方式检查它们

1 - 在基本视图中声明“filterByPermission”函数(所有视图都应继承此视图)

class SampleProject.Views.BaseView extends Backbone.View

  filterByPermission:=>
    #these views will be removed incase user does not have a specific permission
    if @views_permissions?
      for permission, selector of @views_permissions
        unless SampleProject.current_user.has_permission permission
          @$(selector).remove()

    #these views will be removed incase user has a specific permission
    if @remove_views_permissions?
      for permission, selector of @remove_views_permissions
        if SampleProject.current_user.has_permission permission
          @$(selector).remove()

2 - 然后你可以进入另一个视图,继承基本视图并在“views_permissions”中定义你的权限(类似于事件哈希)

class SampleProject.Views.UsersIndex extends SampleProject.Views.BaseView
  views_permissions:
    "create_users":  "#js_create_user_li, #new_user_modal"
    "import_users": "#js_import_btn_li, #import_form_li"
    "edit_users"  :  "#edit_user_modal"
    "delete_users"  :  "#js_delete_user_li, .js-user-selector-header"

  render:=>
    #render your view here
    @filterByPermission()

在渲染视图后3次调用@filterByPermission()。

通过这种方式,您可以根据权限控制视图,而无需在代码中添加if语句

答案 1 :(得分:1)

不确定那里有什么框架,但您可以使用Rails或您使用的任何服务器端框架将您的权限呈现为JavaScript个对象。

例如:

var userAuth = { userId: 1234, userType: 'Admin',
                 /** A little more complex permission scenario */
                 privileges: [{ProjectA: 'admin'}, 
                              {ProjectB: 'user'}, 
                              {ProjectC: 'noaccess'}]};

因此,在您的视图或模板中,您可以根据当前登录用户的权限以声明方式呈现一段UI元素。例如,使用Underscore模板,您可以执行一些JavaScript逻辑和检查。 / p>

/** Operate using a declared variable */
<% if (userAuth.userType === 'Admin') {%>
    <div>This is only shown to admin.</div>
<% } %>

/** OR operate on the actual property on the working model */
<% if (myModelProperty === 'Admin') {%>
    <div>This is only shown to admin.</div>
<% } %>

这种类型的检查也可以在实际的View本身中完成,以限制基于用户等的某些功能。

相关问题