декларативная_авторизация содержит и унаследованные ресурсы - PullRequest
1 голос
/ 17 февраля 2011

У меня есть приложение rails3 с установленными гемами декларативного_авторизации и унаследованных_ресурсов. Позвольте мне показать вам код из моего приложения:

class Blog < ActiveRecord::Base
  has_many :posts
  has_many :memberships, :class_name => "BlogMembership"

  has_many :subscribers, :through => :memberships, :source => :user, :conditions => "blog_memberships.membership_type = #{BlogMembership::SUBSCRIBER} or blog_memberships.membership_type = #{BlogMembership::AUTHOR} or blog_memberships.membership_type = #{BlogMembership::MODERATOR}"
  has_many :authors, :through => :memberships, :source => :user, :conditions => "blog_memberships.membership_type = #{BlogMembership::AUTHOR} or blog_memberships.membership_type = #{BlogMembership::MODERATOR}"
  has_many :moderators, :through => :memberships, :source => :user, :conditions => "blog_memberships.membership_type = #{BlogMembership::MODERATOR}"
end


class Post < ActiveRecord::Base
  belongs_to :blog, :counter_cache => true
  belongs_to :author, :class_name => "User", :foreign_key => "user_id"
end


class BlogMembership < ActiveRecord::Base
  belongs_to :user
  belongs_to :blog

  # Membership types:
  SUBSCRIBER = 0
  AUTHOR = 1
  MODERATOR = 2
end

мои правила авторизации:

authorization do
  role :guest do
    description "Not logged in users and users not assigned to any group"

    ##### Blogs and Posts
    has_permission_on :blogs, :to => [ :read, :list ]

    has_permission_on :posts, :to => [ :read, :feed ]
    has_permission_on :posts, :to => :flag if User.current
  end

  role :admin do
    description "Administrators"
    has_omnipotence # Can manage all
  end

  role :moderator do
    description "Blog moderators"

    includes [ :guest, :blogger ]

    has_permission_on :posts, :to => :manage do
      if_attribute :blog => { :moderators => contains { user } }
    end
  end

  role :blogger do
    description "Blog authors"

    includes :guest
    has_permission_on :posts, :to => :create do
      if_attribute :blog => { :authors => contains { user } }
    end
    has_permission_on :posts, :to => :manage do
      if_attribute :author => is { user }
    end
  end
end

privileges do
  # default privilege hierarchies to facilitate RESTful Rails apps
  privilege :manage, :includes => [:create, :read, :update, :delete]
  privilege :read, :includes => [:index, :show]
  privilege :create, :includes => :new
  privilege :update, :includes => :edit
  privilege :delete, :includes => :destroy
end

в posts / index.html.haml я использую

- if permitted_to? :create, :posts
  .button.add-post
    = link_to "New post", new_resource_path

и в моем posts_controller

class PostsController < InheritedResources::Base
  respond_to :html

  belongs_to :blog
  filter_access_to :all
end

выглядит хорошо, но не работает: (

Тестовый пользователь имеет роль модератора с членством модератора в одном из блогов, но без участия во втором блоге.

Следуя правилам и коду, любой пользователь с ролью модератора может создать сообщение в любом блоге.

Не могли бы вы мне сказать - что мне нужно изменить, чтобы позволить только авторам блогов и модераторам отправлять сообщения в свои блоги, но не в другие блоги?

1 Ответ

2 голосов
/ 22 февраля 2011

Не очень элегантный способ, но я решил это следующим образом:

  1. изменил фильтр доступа в posts_controller:

    filter_resource_access: nested_in =>: blog

  2. Добавлен метод для контроллера сообщений

    protected

    def new_post_for_collection @post = Blog.find (params [: blog_id]). Posts.new end

  3. Изменения в index.html.haml

    • если разрешено_то?: create, @post .button.add-post = link_to "Новая запись", new_resource_path
...