@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":)

Другие вопросы по тегам