Укажите причину отказа в доступе с помощью CanCan - PullRequest
3 голосов
/ 06 октября 2010

Мне очень нравится гем авторизации Rails CanCan .Однако я обнаружил, что у меня есть несколько условий для определенных привилегий, и я хотел бы иметь возможность давать пользователю различные сообщения об ошибках в зависимости от того, почему ему или ей было отказано в доступе.

Имеет ли CanCanмеханизм такого поведения?У меня проблемы с поиском.Придется ли мне раскошелиться на это и добавить это поведение самому?

1 Ответ

2 голосов
/ 06 октября 2010

Я не думаю, что вы можете сделать это с CanCan прямо из коробки.Это действительно только дает возможность сказать, может ли пользователь что-то делать или нет.

Интересно, можно ли использовать это нетипичным способом, хотя и определяя несколько подклассов Ability для проверки разрешений.Реализация по умолчанию состоит в том, чтобы создать экземпляр Ability для текущего пользователя и опросить его.

Если вы создали коллекцию подклассов Ability, чтобы отразить различные виды доступа, которые вы хотите проверить, вы можете затемспросите каждого по очереди, может ли пользователь что-то сделать или нет.Первый, кто отказал бы в разрешении, затем использовался бы для генерации вашего конкретного сообщения об ошибке.

Вам действительно нужно было бы создать всеобъемлющий класс способностей, чтобы объединить коллекцию Ability подклассов и создать ее в current_ability метод, который CanCan предоставляет, чтобы вернуть возможность для текущего пользователя.Затем, предоставляя те же самые методы can? и cannot? для вашего класса, он будет работать так же, как обычные способности, но вы сможете расширить его, чтобы обеспечить метод why?, который мог бы определить, какой Ability подкласс отклонил разрешение и в результате сгенерировал другое сообщение об ошибке.

На самом деле, вам нужно было бы также предоставить новую реализацию authorize!, чтобы она возвращала нужное сообщение об ошибке.

Извините, длинный ответ, который в основном - вам придется сделать это самостоятельно.

...