Rails User -> Роли -> Настройка прав доступа - PullRequest
1 голос
/ 11 февраля 2011

Я работаю над настройкой ролей / разрешений, но не могу заставить ее работать как задумано.

class User < ActiveRecord::Base

    has_and_belongs_to_many :roles, :join_table => "users_roles"
    has_many :permissions, :through => :roles


class Role < ActiveRecord::Base

    has_and_belongs_to_many :users
    has_and_belongs_to_many :permissions, :join_table => "roles_permissions"


class Permission < ActiveRecord::Base

    has_and_belongs_to_many :roles

Мне бы хотелось иметь доступ к ролям и разрешениям непосредственно из моего пользовательского объекта (user.roles, user.permissions).

user.roles работает, но я не могу получить user.permissions для работы. Кто-нибудь может мне помочь?

Другой подход - использовать плагины, такие как Devise + CanCan. Однако у меня есть некоторые опасения по поводу использования плагинов для таких важных вещей, как аутентификация и авторизация - что произойдет, если они будут прекращены? Кто-нибудь, кто имеет на это мнение?

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 февраля 2011

CanCan для авторизации . Authlogic и Devise предназначены для аутентификации . Авторизация и аутентификация - это два разных, но обычно связанных аспекта веб-приложения.

У меня такое ощущение, что вы не можете использовать has_many :through для ссылки на has_and_belongs_to_many ассоциацию. Я думаю, что has_many :through должен ссылаться на has_many ассоциацию. Я не мог найти какую-либо определенную информацию, хотя. Может кто еще знает?

Я никогда не запускаю свою собственную аутентификацию, потому что Devise и Authlogic отлично справляются со своей работой и их легко расширять (особенно Devise). Лучшие практики для безопасного хеширования встроены. OpenID и Facebook аутентификация являются простыми надстройками. Зачем заново изобретать колесо? В худшем случае они останутся без поддержки когда-нибудь в будущем. Для меня это не имеет большого значения, потому что у меня все еще есть исходный код, поэтому мне нечего терять, и все можно получить.

Если вам не нужны ваши разрешения, будьте динамическими, я бы жестко запрограммировал ваши разрешения (то есть действия, которые могут выполнять пользователи в определенных ролях) в файл возможностей CanCan. Вам, вероятно, также не нужна таблица базы данных для ролей, если нет дополнительных метаданных, которые вы хотите сохранить. Я рекомендую избегать ассоциаций has_and_belongs_to_many, потому что большинству приложений в конечном итоге потребуются дополнительные данные, связанные с присоединяющейся таблицей. Это было бы одним из решений для рассмотрения. Есть более простые и более сложные способы достичь того же.

class User < ActiveRecord::Base
  has_many :roles
end

class RoleAssignment < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :role_assignements
  has_many :users, :through => :role_assigments
end

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.roles.include? Role.find_by_name('admin')
      can :manage, :all
    else
      can :read, :all
    end
  end
end
0 голосов
/ 11 февраля 2011

Я думаю, вам лучше использовать CanCan для аутентификации по ролям и т. Д.

Но если вы все еще хотите получить доступ к «разрешениям» из пользовательской модели, я думаю, вы можете сделать это в пользовательской модели следующим образом:

def permissions
    Permission.find(:all, :joins => {:roles => :users}, :conditions => ["users.id = ?", self.id])
  end

Хотя не проверял.

Вы должны проверить это тоже.

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