TurboGears: autorización y autenticación
Una aplicación TurboGears se crea mediante las opciones de inicio rápido y configuración de la aplicación del kit de herramientas de la caja de cambios, que tiene la autorización y el soporte de autenticación habilitado de forma predeterminada. Los modelos declarados en auth.py se configuran e inicializan según los valores asignados en bootstrap.py.
Los siguientes modelos están declarados en auth.py:
Modelo de usuario
El modelo de usuario contiene el diseño de una tabla tg_user. Esta tabla es utilizada por el paquete repose.who. Este paquete repose.who es una biblioteca de autenticación potente y extensible para aplicaciones WSGI. La estructura de un modelo de usuario es la siguiente:
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)
Este modelo de grupo contiene la tabla de definición tg_group. Su definición se da en auth.py de la siguiente manera:
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)
También se configura otro permiso modelo, que contiene la definición del permiso.
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))
En el momento de configurar los modelos, los siguientes datos se agregan en estas tablas:
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)
Modelo de predicado
El módulo de predicados en el paquete tg contiene definiciones para verificadores de predicados. Un predicado es una condición que debe cumplirse para que el usuario pueda acceder a la fuente solicitada. Tal predicado, o condición, puede estar compuesto por más predicados, a los que se les llama predicados compuestos. Los controladores de acción, o controladores, pueden tener solo un predicado, ya sea simple o compuesto.
Si un usuario no ha iniciado sesión o no tiene los permisos adecuados, este verificador de predicados arroja un 401 (HTTP no autorizado), que es capturado por el middleware repoze.who para mostrar la página de inicio de sesión que permite al usuario iniciar sesión y redirigir el usuario vuelve a la página adecuada cuando haya terminado.
Las diferentes condiciones o predicados definidos en el módulo tg.predicates son:
No Señor. | tg.predicates módulo y descripción |
---|---|
1 | All Compruebe si se cumplen todos los predicados especificados |
2 | Any Compruebe si se cumple al menos uno de los predicados especificados |
3 | is_user Verifique que el nombre de usuario del usuario autenticado sea el especificado |
4 | in_group Compruebe que el usuario pertenece al grupo específico. |
5 | in_all_groups Compruebe que el usuario pertenece a todos los grupos especificados. |
6 | in_any_group Compruebe que el usuario pertenece al menos a uno de los grupos especificados. |
7 | is_anonymous Compruebe que el usuario actual sea anónimo. |
8 | has_permission Compruebe que el usuario actual tenga el permiso especificado. |
9 | has_all_permissions Compruebe que al usuario actual se le hayan otorgado todos los permisos especificados. |
10 | has_any_permission Compruebe que el usuario tenga al menos uno de los permisos especificados. |
Por ejemplo, si tiene un predicado, que es grant access user belonging to customers group, entonces puede usar el siguiente verificador de predicados incorporado:
from tg.predicates import in_group
p in_group(‘customers’)
El siguiente verificador de predicados otorgará acceso al usuario 'root' o cualquier persona con permiso de 'administrar' -
from tg.predicates import Any, is_user, has_permission
p = Any(is_user('root'), has_permission('manage'),
sg = 'Only administrators can remove blog posts')