Авторизация в Rails 3.1: CanCan, CanTango, декларативная_авторизация? - PullRequest
7 голосов
/ 18 января 2012

Я посмотрел на Declarative_authorization, CanCan и CanTango.Все они хороши в добавлении авторизации в приложение, но мне было интересно, как добавить авторизацию к конкретному экземпляру модели, то есть человек может иметь доступ к управлению в одном проекте и только ограниченный (читай меньше, чем управлять: ограниченное обновление и т. Д.)в другом.

Не могли бы вы, пожалуйста, лучший способ?Извиняюсь, если мой вопрос звучит слишком тривиально.Это может быть потому, что я новичок в RoR.

спасибо, Джон

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Поскольку я знаю CanCan и Declarative_authorization, и я реализовал авторизацию на основе ролей с обоими, я рекомендую CanCan.Просто мои два цента.

Пример (не проверено, к сожалению, я не могу проверить здесь, и у меня нет доступа к моему коду)

Итак, допустим, у нас есть такая структура:

class User < ActiveRecord::Base
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :users

  # attributes: project_read, project_create, project_update
end

Тогда CanCan может выглядеть следующим образом:

class Ability
  include CanCan::Ability

  def initialize(user)
    @user = user
    @role = user.role

    # user can see a project if he has project_read => true in his role
    can :read, Project if role.project_read? 

    # same, but with create
    can :create, Project if role.project_create?

    # can do everything with projects if he is an admin
    can :manage, Project if user.admin?
  end

end

Всю необходимую информацию вы можете найти в вики CanCan на github.Личная рекомендация читать:

В основном вам просто нужно продлитьпример выше, чтобы включить ваши роли через ваши отношения.Для простоты вы также можете создать дополнительные вспомогательные методы в ability.rb.

Основное среднее предостережение, за которое вы можете согласиться (по крайней мере, я): Убедитесь, что ваш пользователь может сделатьчто-то с моделью, прежде чем определить, что пользователь не может .В противном случае вы будете разочарованы и будете думать: «Но почему? Я никогда не писал, что пользователь не может».Да уж.Но вы также никогда не писали явно, что он может ...

0 голосов
/ 19 января 2012
class User < ActiveRecord::Base

  belongs_to :role
  delegate :permissions, :to => :role

  def method_missing(method_id, *args)
    if match = matches_dynamic_role_check?(method_id)
      tokenize_roles(match.captures.first).each do |check|
        return true if role.name.downcase == check
      end
      return false
    elsif match = matches_dynamic_perm_check?(method_id)
      return true if permissions.find_by_name(match.captures.first)
    else
      super
    end
  end


  private

  def matches_dynamic_perm_check?(method_id)
    /^can_([a-zA-Z]\w*)\?$/.match(method_id.to_s)
  end

  def matches_dynamic_role_check?(method_id)
    /^is_an?_([a-zA-Z]\w*)\?$/.match(method_id.to_s)
  end

  def tokenize_roles(string_to_split)
    string_to_split.split(/_or_/)
  end

end

Использование:

user.is_an?admin

user.can_delete?

...