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

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

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

序号 tg.predicates 模块和描述
1

所有

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

2

任何

检查是否满足指定的谓词中的至少一个

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”用户或任何具有“manage”权限的用户访问权限:

from tg.predicates import Any, is_user, has_permission
p = Any(is_user('root'), has_permission('manage'), 
   sg = 'Only administrators can remove blog posts')
广告