`
zjueman
  • 浏览: 32119 次
  • 来自: ...
社区版块
存档分类
最新评论

Rails:对同一个model的不同访问权限的访问控制的设计

阅读更多
想和大家讨论一个rails的访问控制的设计问题。

假如我有一个user的model,实现对它的增、删、改、列表等功能。普通情况下,我们会实现类似于Scaffold生成的代码。默认进去一个user列表,然后每个user后面有edit, delete等之类的功能。同时列表上面有add的按钮。

假如我要加入权限控制,比如有的人只能看到列表。有的能看到列表和使用add功能,有的人能看到列表并且使用所有的功能。三种不同权限的人都可以看到列表,只不过对列表的操作不同。为了实现这样的访问控制,可以不同的设计。

通常,我会把所有的功能操作都放在一个controller中,这样就只有一套view。但是在显示add, edit, delete之类的按钮时进行判断,只有有相应的权限的人才可以看到这些按钮,进一步在相应的action里面也做相应的判断。 这样可以实现,但是总的来说感觉很凌乱。结构不够好,虽然可以把显示、隐藏操作按钮的逻辑放在helper里面还是感觉乱。

另外一种方法就是把不同的操作放在不同的controller里面,并且对不同的操作权限的人写不同view。这样就几乎完全独立开了。独立的controller,独立的view等等。 就没有那么繁杂的通过权限来判断是否显示按钮的逻辑了。不过就不是很DRY了,类似的列表要写好几次。

在这种情况,不知道大家是怎么设计的?谢谢指点。
分享到:
评论
7 楼 toostupid 2009-02-10  
我的项目刚好做了一个简易的实现,这是migrate

Action 关联 Group
class CreateAdmActions < ActiveRecord::Migration
  def self.up
    create_table :adm_actions do |t|
      t.string :ctrl, :null=>false, :limit=>31
      t.string :actn, :null=>false, :limit=>31
      t.timestamps
    end
    add_index :adm_actions,:actn
    add_index :adm_actions,:ctrl
    add_index :adm_actions,[:ctrl,:actn]

    create_table(:adm_actions_adm_groups,:id=>false) do |t|
      t.integer :adm_action_id, :null=>false
      t.integer :adm_group_id , :null=>false
      t.timestamps
    end
    add_index :adm_actions_adm_groups, :adm_action_id
    add_index :adm_actions_adm_groups,:adm_group_id
    add_index :adm_actions_adm_groups, [:adm_action_id,:adm_group_id],:unique=>true
    
  end

  def self.down
    drop_table :adm_actions_adm_groups
    drop_table :adm_actions
  end
end




class CreateAdmGroups < ActiveRecord::Migration
  def self.up
    create_table :adm_groups do |t|
      t.string :name, :limit=>15, :null=>false
      t.text :desc
      t.timestamps
    end
    add_index :adm_groups, :name, :unique=>true

    create_table(:adm_groups_users,:id=>false) do |t|
      t.integer :adm_group_id, :null=>false
      t.integer :user_id, :null=>false
      t.timestamps
    end
    add_index :adm_groups_users, [:adm_group_id,:user_id], :unique=>true
    add_index :adm_groups_users, :adm_group_id
    add_index :adm_groups_users, :user_id
  end

  def self.down
    drop_table :adm_groups_users
    drop_table :adm_groups
  end
end



不过我并不是很满意,感觉实现起来比较容易,先用着。
activescaffold让我的感觉是可以作为一个起点,但是迟早要丢掉。
6 楼 Auckland 2009-02-10  
kadvin 写道
我认为权限的处理,应该采用Controller的filter来,controller是知道当前用户是谁,而model不应该管当前用户是谁。

我也认同这个想法。
Model里面只是处理数据,然而谁有什么样的权限做什么样的事情,应该由controller判断。
5 楼 toostupid 2009-02-05  
我会单独做一个模块来完成。

把每个/controller/action 和 user group 关联起来。
如果user 关联了 /users/add 那么它就可以add, 不然就不可以
每次用户操作都需要读一次数据库来确定权限。
4 楼 kadvin 2009-02-05  
这个问题我也思考过。
我认为ActiveScaffold的实现思路有问题,不应该将判断权限的事情搞到ActiveRecord里面去。
ActiveScaffold为了让模型能够鉴权,将当前用户信息也植入到模型中(参考其ActiveRecordPermissions),这显然是一个跨界缺陷,这导致AR手伸得太长了。
我认为权限的处理,应该采用Controller的filter来,controller是知道当前用户是谁,而model不应该管当前用户是谁。
3 楼 zjueman 2009-02-02  
好像有一些demo是和权限控制相关的,我研究一下,多谢open2ye
2 楼 zjueman 2009-02-02  
好像activerecord没有直接和我的问题相关阿。
如果给每个model创建一个独立的admin的功能,那么就相当于我说的第二种方案,创建独立的controller以及相应的view.
1 楼 open2ye 2009-02-02  
看看 ActiveScaffold

相关推荐

    Rails3 device and cancan

    而Cancan则是一个用于授权的gem,用于控制用户对不同资源的访问权限。 从给定的文件内容中,我们可以提取出以下知识点: 1. Ruby on Rails和Ruby on Rails插件的基础概念。 Ruby on Rails(通常简称为Rails)是一...

    Ruby-Trestle一个RubyonRails的现代响应管理框架

    3. 管理权限:Trestle提供了角色基础的访问控制,允许设置不同用户群体对资源的访问权限。 4. 菜单和导航:开发者可以通过定义菜单结构,轻松地构建后台的导航系统。 5. 集成ActiveRecord:Trestle无缝集成Rails的...

    Ruby-Trailblazer构建在Rails之让提供一个直观的代码结构并给你一个面向对象的架构

    Trailblazer 是 Ruby 社区中一款创新的 Web 开发框架,它是在 Ruby on Rails(Rails)的基础上构建的,旨在为开发者提供更加直观的代码组织方式以及一个强大的面向对象架构。Trailblazer 提倡分离关注点(Separation...

    ruby on rails 搭建redmine

    Ruby on Rails 是一个基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,用于快速开发高效、优雅的web应用程序。Redmine则是一个用Ruby on Rails构建的项目管理软件,提供了任务跟踪、...

    The Rails Way

    - **MVC架构**:深入讲解Rails中的Model-View-Controller架构模式,解释每个组成部分的作用及它们之间的交互方式。 - **数据库操作**:包括Active Record的基础用法、高级查询技巧以及数据库迁移的管理方法等。 - **...

    RESTful.Rails.Development.2015.10.pdf

    - **授权管理**:控制不同用户角色对资源的操作权限,确保数据安全。 ### 6. 测试和部署 - **单元测试**:编写单元测试以确保每个部分的功能正确。 - **集成测试**:测试各个组件之间的交互是否符合预期。 - **...

    Agile Web Development with Rails中文版 3rd Edition

    增加了访问权限控制,确保只有经过授权的用户才能访问某些资源。 **11.4 迭代F4:增加边栏,以及更多的管理功能** 增强了后台管理界面,并添加了更多实用的功能。 #### 十二、任务G:最后一点小改动 这部分介绍...

    rails登陆画面(原)

    在 Rails 中,登录功能是许多 web 应用程序的基础部分,用于验证用户身份并控制访问权限。 在 Rails 应用中,实现登录界面通常涉及以下几个关键步骤: 1. **用户模型**:首先,你需要创建一个 User 模型,用于存储...

    Docamp-Ruby-on-Rails:我的第一个Ruby on Rails项目(项目管理Web应用程序)

    Docamp 是一个基于 Ruby on Rails 框架构建的项目管理Web应用程序,灵感来源于Basecamp。这个项目目前还处于开发阶段,意味着它可能包含了各种基本功能的实现,但可能存在未完成或需要优化的部分。让我们深入了解...

    使用rails6开发纯后端API项目.zip

    在Rails 6中开发纯后端API项目是一个常见的任务,特别是在构建现代Web应用程序时,前端与后端分离的架构越来越流行。Rails作为一个强大的Ruby框架,提供了丰富的功能来帮助开发者高效地构建API服务。下面我们将详细...

    ruby on rails 安装手记

    Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。在本篇文章中,我们将深入探讨Rails的安装过程,以及在这个...

    Rails插件收集

    标题“Rails插件收集”指的是一个关于Ruby on Rails框架中插件资源的汇集。Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在提升开发效率和...

    用rails做个简单的论坛(三):将之前的串连起来

    Rails提供了如`before_action`回调和CanCanCan这样的授权库来控制访问权限。例如,只有登录用户才能创建帖子或评论,我们可以使用`authenticate_user!`这样的回调来实现。 ### 七、部署与测试 完成开发后,我们...

    acts_as_privilege.rb:Rails 的简单权限解决方案

    这种基于 ACL 的安全模型被设计为基于角色的访问控制,其中每个角色可以是一组用户。 地位 哲学 只做一件事的通用库,没有任何功能。 安装 在您的Gemfile包含 gem : gem 'acts_as_privilege' 并运行bundle命令。...

    ruby gems (rails ,padrino, cancan ,puppet)

    Rails是Ruby on Rails的简称,它是一个基于MVC(Model-View-Controller)架构模式的开源Web应用程序框架。Rails强调“约定优于配置”和“DRY(Don't Repeat Yourself)”原则,大大简化了开发流程。它内置了丰富的...

    ruby on rails学生选课系统

    Ruby on Rails(简称Rails)是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用的开发过程,提高开发效率。在构建学生选课系统时,Rails的强大功能和简洁语法...

    Apress.Practical.Rails.Social.Networking.Sites.Jun.2007.eBook-BBL.pdf

    - **权限控制**:实现基于角色的访问控制(Role-Based Access Control, RBAC)。 ##### 4. 性能优化 - **缓存策略**:使用页面级缓存、片段缓存等技术提高响应速度。 - **数据库优化**:合理设计数据库表结构、...

    这是一个简单的分步演示,说明如何快速设置Rail.zip

    在IT行业中,Rails框架是Ruby on Rails的简称,它是一个基于Ruby编程语言的开源Web应用程序框架,遵循MVC(模型-视图-控制器)架构模式。这个“Rail.zip”文件可能是一个包含Rails项目的压缩包,其中可能包含了示例...

    sozluk:Rails 的字典实验

    在描述中提到的"行政"部分,可能是Rails应用中的一个控制器(Controller)或模型(Model),用于处理与管理员或行政相关的任务,比如用户管理、权限控制等。在Rails的MVC(Model-View-Controller)架构中,控制器...

Global site tag (gtag.js) - Google Analytics