TurboGears - Авторизация и аутентификация
Приложение TurboGears создается с помощью параметров быстрого запуска и настройки приложения набора инструментов коробки передач, в котором по умолчанию включена поддержка авторизации и аутентификации. Модели, объявленные в auth.py, настраиваются и инициализируются в соответствии со значениями, присвоенными в bootstrap.py.
Следующие модели объявлены в auth.py -
Модель пользователя
Модель User содержит дизайн таблицы tg_user. Эта таблица используется пакетом repose.who. Этот пакет repose.who является мощной, а также расширяемой библиотекой аутентификации для приложений WSGI. Структура модели пользователя следующая -
class User(DeclarativeBase):
"""
__tablename__ = 'tg_user'
user_id = Column(Integer, autoincrement = True, primary_key=True)
user_name = Column(Unicode(16), unique = True, nullable = False)
email_address = Column(Unicode(255), unique = True,nullable=False)
display_name = Column(Unicode(255))
_password = Column('password', Unicode(128))
created = Column(DateTime, default = datetime.now)
Эта групповая модель содержит определение таблицы tg_group. Его определение дается в auth.py следующим образом:
class Group(DeclarativeBase):
__tablename__ = 'tg_group'
group_id = Column(Integer, autoincrement = True,primary_key = True)
group_name = Column(Unicode(16),unique = True,nullable = False)
display_name = Column(Unicode(255))
created = Column(DateTime, default = datetime.now)
Также настраивается другое разрешение модели, которое содержит определение разрешения.
class Permission(DeclarativeBase):
__tablename__ = 'tg_permission'
permission_id = Column(Integer,autoincrement = True,primary_key = True)
permission_name = Column(Unicode(63), unique = True, nullable = False)
description = Column(Unicode(255))
Во время настройки моделей в эти таблицы добавляются следующие данные:
u = model.User()
u.user_name = 'manager'
u.display_name = 'Example manager'
u.email_address = '[email protected]'
u.password = 'managepass'
model.DBSession.add(u)
g = model.Group()
g.group_name = 'managers'
g.display_name = 'Managers Group'
g.users.append(u)
model.DBSession.add(g)
p = model.Permission()
p.permission_name = 'manage'
p.description = 'This permission gives an administrative right'
p.groups.append(g)
model.DBSession.add(p)
u1 = model.User()
u1.user_name = 'editor'
u1.display_name = 'Example editor'
u1.email_address = '[email protected]'
u1.password = 'editpass'
model.DBSession.add(u1)
Модель предиката
Модуль предикатов в пакете tg содержит определения для средств проверки предикатов. Предикат - это условие, которое должно быть выполнено, чтобы пользователь мог получить доступ к запрошенному источнику. Такой предикат или условие может состоять из нескольких предикатов - они называются составными предикатами. Контроллеры действий или контроллеры могут иметь только один предикат, будь то одиночный или составной.
Если пользователь не вошел в систему или не имеет необходимых разрешений, эта программа проверки предикатов выдает ошибку 401 (HTTP Unauthorized), которая перехватывается промежуточным программным обеспечением repoze.who для отображения страницы входа, позволяющей пользователю войти в систему, и перенаправления пользователь вернется на нужную страницу, когда они будут закончены.
Различные условия или предикаты, определенные в модуле tg.predicates:
Sr. No. | Модуль tg.predicates и описание |
---|---|
1 | All Проверить, соблюдены ли все указанные предикаты |
2 | Any Проверить, выполняется ли хотя бы один из указанных предикатов |
3 | is_user Убедитесь, что имя пользователя аутентифицированного пользователя является указанным |
4 | in_group Убедитесь, что пользователь принадлежит к определенной группе. |
5 | in_all_groups Убедитесь, что пользователь принадлежит ко всем указанным группам. |
6 | in_any_group Убедитесь, что пользователь принадлежит хотя бы к одной из указанных групп. |
7 | is_anonymous Убедитесь, что текущий пользователь анонимен. |
8 | has_permission Убедитесь, что текущий пользователь имеет указанное разрешение. |
9 | has_all_permissions Убедитесь, что текущему пользователю предоставлены все указанные разрешения. |
10 | has_any_permission Убедитесь, что у пользователя есть хотя бы одно из указанных разрешений. |
Например, если у вас есть предикат, grant access user belonging to customers group, то вы можете использовать следующую встроенную программу проверки предикатов -
from tg.predicates import in_group
p in_group(‘customers’)
Следующая проверка предикатов предоставит доступ пользователю root или любому лицу с разрешением на управление:
from tg.predicates import Any, is_user, has_permission
p = Any(is_user('root'), has_permission('manage'),
sg = 'Only administrators can remove blog posts')