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