如何控制用户资产,但让管理员查看所有内容?

时间:2009-03-04 07:52:12

标签: ruby-on-rails activerecord

我有一个Rails应用程序,其中用户拥有项目的成员资格(以及其他内容,多态)。用户还有角色。我希望User#项目像普通的ActiveRecord查找一样工作,但我也希望管理员可以访问每个项目。

有一段时间我一直这样做:

class User < ActiveRecord::Base
   has_many :memberships, :dependent => :destroy

   def projects
     if has_role?(:admin)
       Project.find(:all)
     else
       Project.find(:all, :include => :memberships, :conditions => ["memberships.user_id = ?", id])
     end
   end
end

class Project < ActiveRecord::Base
  has_many :memberships, :as => :member, :dependent => :destroy
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :member, :polymorphic => :true
end

但我真的宁愿做这样的事情:

class User < ActiveRecord::Base
  has_many :memberships, :dependent => :destroy
  has_many :projects, :through => :memberships, :source => :member, :source_type => "Project"
end

这样我可以更频繁地使用named_scope(例如'alfred.projects.recent.active')。

如果您自动为管理员添加新的成员资格,则会有效,但很快就会失控。

我想保留User#projects接口。这里的正确轨道是什么?

非常感谢。

3 个答案:

答案 0 :(得分:1)

Take a look at activefx's restfull authenticaion tutorial:(restful authentication tutorial)这是一款具有以下功能的rails应用程序:

当前功能

- Login / Logout
- Restful, with the exception of the "activate" action
- Namespaced admin and user sections
- OpenID Authentication with support for incomplete OpenID    profiles
- Roles and permissions
- Administrative user controller
- Set roles, activate, enable / disable users  
- Login, permission, and access denied redirection system
- Member list and public profiles for logged in users
- Activation, with option to resend activation code
- Beta invitation system 
- easy on/off functionality, add/remove invites, send emails to   
- pending users
- Forgot Password / Reset Password
- Change Password 
- Failed login attempts database logging
- Recaptcha displayed for more than 5 failed logins
- Helper methods (link_to_user, if_admin?, etc.)

This thread will explain how you give owner and administrator access. #28.

祝你好运。

答案 1 :(得分:0)

我个人不喜欢按照您尝试的方式在模型中传播授权问题。

这有几个原因(主要是因为它最终通常导致非RESTful设计)。另一个是矛盾的方法问题。

想一想。

user.projects在您的系统中意味着什么?在你的模型中它有两个含义:它意味着

  1. 用户参与的所有项目,
  2. 所有存在的项目。
  3. 如果你以这种方式建模你的系统,你必须得到一堆具有许多不同含义的方法,即。目的(想想你有三个,四个或更多角色的情况),这不是一个好习惯。但是有更多的原因。例如。如果某个用户有多个角色怎么办?管理员通常也是普通用户。

    那么“正确”的解决方案是什么? 好吧,它们可能有更多,但我现在喜欢和使用的是rails-authorization-plugin使用的那个。在模型中定义角色并在控制器和视图中实现授权逻辑。查看plugin以了解详情。

    希望有所帮助!如果没有,请发表评论。

答案 2 :(得分:0)

我将为RESTful_ACL插入一个无耻的插件:http://github.com/mdarby/restful_acl/tree/master