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-запрос, который устанавливается в фоновом режиме.