@auth.requires_permission не работает, версия 2
Добрый день всем специалистам web2py!
Я не могу найти способ использования web2py декораторов
@auth.requires_permission('read','person')
def f(): ....
в руководстве pdf говорится, что:
запрещает посетителям доступ к функции f, если только посетитель не является членом группы, члены которой имеют права "читать" записи таблицы "персона". Если посетитель не вошел в систему, посетитель будет перенаправлен на страницу входа в систему (предоставляется по умолчанию web2py). web2py также поддерживает компоненты, то есть действия, которые могут быть загружены в представление и взаимодействовать с посетителем через Ajax без повторной загрузки всей страницы. Это делается с помощью помощника LOAD, который позволяет очень модульную разработку приложений; это обсуждается в главе 3 в контексте вики и, в некоторых деталях, в последней главе этой книги. Это 5-е издание книги описывает web2py 2.4.1 и более поздние версии.
В моем случае:
У меня есть список групп: Admin_Tier_1, Admin_Tier_2, Admin_Tier_3
Admin_Tier_1 - обладает самыми высокими правами доступа ко всем функциям, таким как добавление учебного года, установка учебного года и т. Д.
Admin_Tier_2 - имеет право добавлять студентов и т. Д.
Admin_Tier_3 - это самый низкий уровень полномочий, который может добавлять штрафы только к студентам (сотрудники организации)
Теперь я использую код Decorator, как это:
@auth.requires_permission('Admin_Tier_1','student_list')
def add(): ....
теперь я вхожу в аккаунт председателя, который зарегистрирован в auth_membership как Admin_Tier_1. Затем я нажимаю ссылку "Список студентов", которая перенаправляет функцию add(): но система возвращает сообщение:
Not Authorized
Insufficient privileges
2 ответа
auth.requires()
метод может принимать вызываемое, а не логическое значение в качестве условия, и это предпочтительно, когда логическое значение дорого генерировать (в противном случае логическое значение генерируется при каждом обращении к контроллеру, даже если конкретная декорированная функция не является один из них называется). Итак, чтобы не звонить auth.has_membership
Излишне, вы можете сделать:
@auth.requires(lambda: auth.has_membership('Admin_Tier_1') or
auth.has_membership('Admin_Tier_2'))
Теперь два auth.has_membership
вызовы будут выполняться только тогда, когда вызывается реальная декорируемая функция.
Кроме того, если вам нужно проверить большее количество ролей, вы можете сделать что-то вроде:
@auth.requires(lambda: any([auth.has_membership(r) for r in ['list', 'of', 'roles']))
Задача решена:
@auth.requires(auth.has_membership('Admin_Tier_1') or auth.has_membership('Admin_Tier_2'))
источник здесь.
Всякий раз, когда я захожу на страницу, если пользователь входит в группу Admin_Tier_3, система блокирует доступ и перенаправляет его на страницу "/default/user/not_authorized":)