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 = '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 包中的 predicates 模块包含谓词检查器的定义。谓词是用户能够访问所请求的源所必须满足的条件。这样的谓词或条件可以由更多谓词组成——这些谓词称为复合谓词。动作控制器或控制器可能只有一个谓词,无论是单个谓词还是复合谓词。

如果用户未登录,或者没有适当的权限,该谓词检查器会抛出 401(HTTP 未授权),该错误由 repoze.who 中间件捕获,以显示允许用户登录的登录页面,并重定向用户完成后返回正确的页面。

tg.predicates 模块中定义的不同条件或谓词是 -

先生。 tg.predicates 模块和说明
1

全部

检查是否满足所有指定的谓词

2

任何

检查是否至少满足指定谓词之一

3

是用户

检查经过身份验证的用户的用户名是否是指定的用户名

4

组内

检查用户是否属于特定组。

5

在所有组中

检查用户是否属于所有指定的组。

6

在_任何_组中

检查用户是否至少属于指定组之一。

7

是_匿名

检查当前用户是否为匿名用户。

8

有权限

检查当前用户是否具有指定的权限。

9

拥有所有权限

检查当前用户是否已被授予所有指定的权限。

10

有任何权限

检查用户是否至少具有指定的权限之一。

例如,如果您有一个谓词,即授予属于客户组的访问用户,那么您可以使用以下内置谓词检查器 ​​-

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')