malworm
@malworm

Почему нет доступа к некоторым страницам?

Использую cancancan для авторизации и devise для аутентификации.
class Ability
  include CanCan::Ability
    def initialize(user)
        can :read, :all

        if user && user.role?(:admin)
            can :access, :rails_admin
            can :dashboard
            can :manage, :all
        elsif user && user.role?(:user)
            can :create, [Post, Comment]
            can :update, Post, user_id: user.id
            can :update, User, id: user.id
            can [:update, :destroy], Comment, user_id: user.id
        elsif user && user.role?(:moderator)
            can [:create, :update, :destroy], [Post, Comment]
        end
    end
end

Вот мой контроллер
class PostsController < ApplicationController
  before_action :authenticate_user!, except: [:index, :show]
  load_and_authorize_resource

  def index
    @posts = Post.all.order('created_at DESC')
  end

  def withtag
    if params[:tag]
      @posts = Post.tagged_with(params[:tag]).order('created_at DESC')
      @tagname = params[:tag]
      @tag = Tag.find_by_name(params[:tag])
    end
  end

  def usernews
    @posts = []
    allPosts = Post.all.order('created_at DESC')
    userTags = current_user.subscribed_tags.map(&:name)
    allPosts.each do |post|
      postTags = post.tag_list.split(',')
      userTags.each do |tag|
        if postTags.include?(tag)
          @posts.push(post)
          break
        end
      end
    end
  end

  def userposts
    @user = User.find(params[:id])
    @posts = Post.where(user_id: @user.id).order('created_at DESC')
  end

  def new
    @post = Post.new
  end

  def create
    @post = current_user.posts.build(post_params)
    @post.user_id = current_user.id

    if @post.save
     redirect_to @post
    else
      render 'new'
    end
  end

  def show
    @post = Post.find(params[:id])
  end

  def edit
    @post = Post.find(params[:id])
  end

  def update
    @post = Post.find(params[:id])

    if @post.update(post_params)
      redirect_to @post
    else
      render 'edit'
    end
  end

  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    redirect_to root_path
  end

  private
    def post_params
      params.require(:post).permit(:title, :body, :image, :tag_list)
    end
end

Когда пытаюсь посмотреть новостную ленту, посты по тэгу или посты конкретного пользователя и при этом залогинен не админ пользователем, то получаю
You are not authorized to access this page

Если прописать юзеру и модератору
сan :manage, :all

То нет проблем с доступом, не понимаю почему без этого не пускает, ведь can :read, :all прописано
Как решить проблему с доступом?
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
Dem1
@Dem1 Куратор тега Ruby on Rails
Ruby on Rails developer
У Вас нету политики для данных методов в ability.rb
Как-то так:
# ability.rb
...
elsif user && user.role?(:user)
...
            can :read, :tags
# posts_controller.rb
def withtag
    authorize! :read, :tags
    if params[:tag]
      @posts = Post.tagged_with(params[:tag]).order('created_at DESC')
      @tagname = params[:tag]
      @tag = Tag.find_by_name(params[:tag])
    end
  end

Если к этому экшену не нужная проверка на авторизацию, то можно ее пропусти в контроллер, так:
skip_authorize_resource :only => : withtag
Или же, можно использовать на load_and_authorize_resource :except, :only
load_and_authorize_resource :only => [:index, :show]

А вообще лучше изучать доки на githube у гема)
В вашем случае раз и два
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы