TurboGears – 授权和身份验证
TurboGears 应用程序由 gearbox 工具包的 quickstart 和 setup-app 选项创建,默认情况下启用授权和身份验证支持。auth.py 中声明的模型根据 bootstrap.py 中指定的值进行设置和初始化。
auth.py − 中声明了以下模型
用户模型
用户模型包含 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 = 'manager@somedomain.com' 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 = 'editor@somedomain.com' u1.password = 'editpass' model.DBSession.add(u1)
谓词模型
tg 包中的谓词模块包含谓词检查器的定义。谓词是用户必须满足才能访问请求源的条件。这样的谓词或条件可能由更多谓词组成 - 这些谓词称为复合谓词。动作控制器或控制器可能只有一个谓词,无论是单个谓词还是复合谓词。
如果用户未登录或没有适当的权限,此谓词检查器将抛出 401(HTTP 未授权),该错误会被 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 检查用户是否至少具有指定的权限之一。 |
例如,如果您有一个谓词,即授予属于客户组的访问权限,那么您可以使用以下内置谓词检查器 −
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')