2017-01-25 2 views
1

Я использую жемчужину CanCan в своем приложении Rails и хочу проверить, является ли текущий запрос защищенным ресурсом в моем приложении.Проверьте, не защищен ли текущий запрос в Rails с помощью CanCan

Так, например, у меня есть следующие:

class AdminController < ApplicationController 

    load_and_authorize_resource 

end 

Как я могу проверить, если запрос защищен канкан?

Я могу получить доступ к контроллеру и действовать через параметры. Я не могу использовать стандартные помощники и cannot?, поскольку они будут проверять, имеет ли разрешение current_user, а не если на самом деле это действие имеет защиту.

Так, например:

class ApplicationController < ActionController::Base 

    before_action :check_protected 

    def check_protected 
    if can? params[:action].to_sym, Object.const_get(params[:controller].classify) 
     # resource is protected 
    else 
     # resource is not protected 
    end 
    end 

end 

^^ Это не будет работать, потому что он всегда будет говорить false, когда нет current_user или если пользователь не имеет прав. Мне нужно проверить, защищен ли сам ресурс CanCan.

Если бы я имел эти примеры:

class PostsController < AdminController 

    def index 
    end 

end 

class HomeController < ApplicationController 

    def index 
    end 

end 

Индекс для PostsController должен быть идентифицирован как защищенные, и индекс для HomeController как незащищенные.

+0

CanCan является жемчужиной авторизации пользователя, цель состоит в том, чтобы проверить, если пользователь имеет доступ к авторизованному ресурсу. Для этого требуется класс способности и метод current_user. Вы можете переопределить значения по умолчанию, как описано [на этой странице] (https://github.com/ryanb/cancan/wiki/changing-defaults). – trueinViso

+0

@trueinViso У меня есть как класс 'Способность', так и метод' current_user'. Но я хочу знать, имеет ли текущий метод контроллера какие-либо атрибуты cancan, прикрепленные к нему. – Cameron

+0

У контроллера нет атрибутов cancan, прикрепленных к нему. Способности определяются на current_user. Когда вы скажете skip_authorize_resource, это означает, что он не будет проверять, имеет ли текущий_user доступ к ресурсу. – trueinViso

ответ

1

CanCan использует метод CanCan::ControllerResource#skip?, чтобы определить, должен ли он разрешать ресурс или нет. Таким образом, я предполагаю, что вы можете полагаться на него следующим образом:

def check_protected 
    if CanCan::ControllerResource.new(self).skip?(:authorize) 
     # resource is not protected 
    else 
     # resource is protected 
    end 
    end 

Я попробовал это в моей песочнице, и она работала для меня

+0

Получение ошибки 'uninitialized constant CanCan :: ControllerResouce', поэтому он всегда считает, что ресурс защищен. – Cameron

+0

синтаксис может опасаться в зависимости от версии CanCan, которую вы используете –

+0

. Он больше не жалуется на ошибку, но все равно возвращает false для всех, даже ресурсов, которые имеют защиту от них. Например, 'self' возвращает' # 'и Dashboard наследует от моего AdminController, у которого есть' load_and_authorize_resource'in. – Cameron

Смежные вопросы