javascript - 主干 View 的声明性授权(权限)

标签 javascript templates backbone.js cancan declarative

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

背景:但是,在前端的 UI 层中,我还没有发现任何东西可以提供相同类型的抽象来处理用户看到的内容和他们有权执行的操作(显然也总是有后端身份验证层) .例如,您是否向用户显示一个按钮?我们是否包含“contenteditable”元素属性?如果用户点击“喜欢”,我们是尝试注册还是向他们显示登录对话框?

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

跟进:问题是在 View 中还是在模板中进行评估?这是模板语言的特性还是我们传递给模板的一组 bool 变量?

旁白: 我有一个 cancan 模仿工具的想法,其中方法签名类似于 App.can('like',project,user),其中 project 和 user 是 BB 模型对象。但问题可能是用户可以对任何给定对象执行的不同操作的数量。 IE。例如项目、编辑项目、评论项目、邀请 friend 加入项目等。其中一些可以简化为 RESTful 操作,但我认为大多数人会同意 UI 呈现更多类型的操作。

最佳答案

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

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

1-在你的基础 View 中声明“filterByPermission”函数(你所有的 View 都应该继承这个)

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-然后你可以进入另一个继承基本 View 的 View 并在“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()

渲染 View 后 3 次调用 @filterByPermission()。

这样一来,您就可以在一处根据权限控制 View ,而无需在整个代码中添加 if 语句

关于javascript - 主干 View 的声明性授权(权限),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14632572/

相关文章:

javascript - 如何在 javascript 中填充字符串长度?

javascript - Ajax setRequestHeader 不起作用

javascript - 如何修复 Django 中的 "object() takes no parameters"错误

c++ - 哪种方式更好地定义类型特征或行为?

c++ - 从模板派生的模板化

C++ 方法名称作为模板参数

jquery - 如何使用 Backbone.js 在changePage后显示主JQuery Mobile页面

javascript - 未捕获的 TypeError : changeTodoText. addEventListener 不是函数

javascript - Parse.com : How to paginate results from a Parse. 查询?

javascript - 想要在单击时将特定值发送到 javascript 处理程序