Web2py - Контроль доступа
Аутентификация
Почти каждое приложение должно иметь возможность аутентифицировать пользователей и устанавливать разрешения. web2py поставляется с обширным и настраиваемым контролем доступа на основе ролейmechanism.web2py. Он также поддерживает такие протоколы, как CAS, OpenID, OAuth 1.0, LDAP, PAM, X509 и многие другие.
web2py включает механизм, известный как механизм управления доступом на основе ролей (RBAC), который представляет собой подход к ограничению доступа к системе для авторизованных пользователей. Класс web2py, реализующий RBAC, называется Auth.
Взгляните на схему, приведенную ниже.
Auth определяет следующие таблицы -
Старший Нет | Название и описание таблицы |
---|---|
1 | auth_user хранит имя пользователя, адрес электронной почты, пароль и статус. |
2 | auth_group хранит группы или роли для пользователей в структуре многие-ко-многим |
3 | auth_membership Хранит информацию о ссылках пользователей и групп в структуре многие-ко-многим |
4 | auth_permission Таблица связывает группы и разрешения. |
5 | auth_event регистрирует изменения в других таблицах и успешный доступ |
6 | auth_cas Он используется для централизованной службы аутентификации. |
Настройка аутентификации
Есть два способа настроить Auth.
Чтобы определить обычай db.auth_user стол с нуля.
Пусть web2py определяет auth стол.
Давайте посмотрим на последний метод определения authстол. вdb.py модель замените следующую строку -
auth.define_tables()
Замените его следующим кодом -
auth.settings.extra_fields['auth_user'] = [
Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}')),
Field('address','text')
]
auth.define_tables(username = True)
Предполагается, что каждый пользователь состоит из номера телефона, имени пользователя и адреса.
auth.settings.extra_fieldsэто словарь дополнительных полей. Ключ - это имя таблицы аутентификации, в которую нужно добавить дополнительные поля. Значение представляет собой список дополнительных полей. Здесь мы добавили два дополнительных поля,phone_number and address.
usernameдолжен обрабатываться особым образом, потому что он участвует в процессе аутентификации, который обычно основан на поле электронной почты. Передав аргумент имени пользователя в следующую строку, он сообщает web2py, что нам нужно поле имени пользователя, и мы хотим использовать его для входа в систему вместо поля электронной почты. Он действует как первичный ключ.
auth.define_tables(username = True)
Имя пользователя рассматривается как уникальное значение. Могут быть случаи, когда регистрация происходит вне обычной регистрационной формы. Также бывает, что новый пользователь вынужден войти в систему, чтобы завершить регистрацию.
Это можно сделать с помощью фиктивного поля, complete_registration это установлено на False по умолчанию и установлен на True когда они обновляют свой профиль.
auth.settings.extra_fields['auth_user'] = [
Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}'),
comment = "i.e. 123-123-1234"),
Field('address','text'),
Field('complete_registration',default = False,update = True,
writable = False, readable = False)
]
auth.define_tables(username = True)
Этот сценарий может предполагать, что новые пользователи после входа в систему завершат свою регистрацию.
В db.py, в папке моделей мы можем добавить следующий код -
if auth.user and not auth.user.complete_registration:
if not (request.controller,request.function) == ('default','user'):
redirect(URL('default','user/profile'))
Это заставит новых пользователей отредактировать свой профиль в соответствии с требованиями.
Авторизация
Это процесс предоставления пользователям некоторого доступа или разрешения на что-либо.
В web2py после создания или регистрации нового пользователя создается новая группа, содержащая этого пользователя. Роль нового пользователя условно называется“user_[id]” где id - уникальный идентификатор пользователя.
Значение по умолчанию для создания новой группы -
auth.settings.create_user_groups = "user_%(id)s"
Создание групп среди пользователей можно отключить:
auth.settings.create_user_groups = None
Создание, предоставление доступа определенным членам и разрешениям также может быть выполнено программно с помощью appadmin.
Некоторые из реализаций перечислены ниже -
Старший Нет | Команда и использование |
---|---|
1 | auth.add_group('role', 'description') возвращает идентификатор вновь созданной группы. |
2 | auth.del_group(group_id) Удаляет группу с указанным id |
3 | auth.del_group(auth.id_group('user_7')) Удаляет группу пользователей с указанным идентификатором. |
4 | auth.user_group(user_id) Возвращает значение идентификатора группы, однозначно связанной для данного пользователя. |
5 | auth.add_membership(group_id, user_id) Возвращает значение user_id для заданного group_id |
6 | auth.del_membership(group_id, user_id) Отменяет доступ данного member_id, то есть user_id, из данной группы. |
7 | auth.has_membership(group_id, user_id, role) Проверяет, принадлежит ли user_id заданной группе. |
Центральная служба аутентификации (CAS)
web2py предоставляет отраслевой стандарт, а именно службу аутентификации клиента - CAS как для клиента, так и для сервера, встроенный в web2py. Это сторонний инструмент аутентификации.
Это открытый протокол для распределенной аутентификации. Работа CAS выглядит следующим образом -
Если пользователь посещает веб-сайт, протокол проверяет, аутентифицирован ли пользователь.
Если пользователь не аутентифицирован в приложении, протокол перенаправляет на страницу, где пользователь может зарегистрироваться или войти в приложение.
Если регистрация завершена, пользователь получает электронное письмо. Регистрация не будет завершена до тех пор, пока пользователь не подтвердит электронную почту.
После успешной регистрации пользователь аутентифицируется с помощью ключа, который используется устройством CAS.
Ключ используется для получения учетных данных пользователя через HTTP-запрос, который устанавливается в фоновом режиме.