Как я могу контролировать пользовательские активы, но позволить администраторам видеть все? - PullRequest
2 голосов
/ 04 марта 2009

У меня есть приложение 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 #. Какой правильный путь здесь?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 04 марта 2009

Взгляните на учебник restfull по аутентификации activefx: (учебник по аутентификации restful) Это приложение 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.)

В этой теме объясняется, как вы предоставляете владельцу и администратору доступ. # 28.

Удачи.

0 голосов
/ 05 марта 2009

Я вставлю бесстыдный плагин для RESTful_ACL: http://github.com/mdarby/restful_acl/tree/master

0 голосов
/ 05 марта 2009

Мне лично не нравится распределять проблемы авторизации по моделям так, как вы пытаетесь это сделать.

Для этого есть несколько причин (главная из которых заключается в том, что в итоге это обычно приводит к не-RESTful дизайну). Другой заключается в проблеме амбивалентных методов.

Подумай об этом.

Что означает user.projects в вашей системе? В вашей модели это имеет два значения: это означает

  1. все проекты, в которых участвует пользователь,
  2. все существующие проекты.

Если бы вы смоделировали свою систему таким образом, вам бы пришлось в конечном итоге использовать множество методов с разными значениями, т.е. цели (подумайте о случае, когда у вас есть три, четыре или более ролей), что не является хорошей практикой. Есть и другие причины. Например. Что, если у какого-то пользователя было более одной роли? Админы обычно тоже обычные пользователи.

Что такое «правильное» решение тогда? Ну, возможно, их больше, но тот, который мне нравится и который я сейчас использую, - это тот, который используется rails-authorization-plugin. Определите роли в моделях и реализуйте логику авторизации в контроллерах и представлениях. Проверьте плагин , чтобы увидеть больше.

Надеюсь, это поможет! Если нет, просто оставьте комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...