Web2py - 访问控制

身份验证

几乎每个应用程序都需要能够验证用户身份并设置权限。 web2py 附带了广泛且可定制的基于角色的访问控制mechanism.web2py。 它还支持 CAS、OpenID、OAuth 1.0、LDAP、PAM、X509 等协议。

web2py 包含一种称为基于角色的访问控制机制 (RBAC) 的机制,这是一种限制授权用户访问系统的方法。 实现RBAC的web2py类称为Auth。

查看下面给出的架构。

验证

Auth 定义了下表 −

Sr.No 表名称和描述
1

auth_user

存储用户的姓名、电子邮件地址、密码和状态。

2

auth_group

以多对多结构存储用户的组或角色

3

auth_membership

以多对多的结构存储链接用户和组的信息

4

auth_permission

该表链接组和权限。

5

auth_event

记录其他表中的更改以及成功的访问

6

auth_cas

用于中央身份验证服务

自定义身份验证

有两种方法可以自定义Auth。

  • 从头开始定义自定义 db.auth_user 表。

  • 让 web2py 定义 auth 表。

让我们看看定义 auth 表的最后一种方法。 在 db.py 模型中,替换以下行 −

auth.define_tables()

将其替换为以下代码 −

auth.settings.extra_fields['auth_user'] = [
   Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}')),
   Field('address','text')
]

auth.define_tables(username = True)

假设每个用户由电话号码、用户名和地址组成。

auth.settings.extra_fields 是额外字段的字典。 键是要添加额外字段的 auth 表的名称。 该值是额外字段的列表。 在这里,我们添加了两个额外字段:phone_number 和 address

username 必须以特殊方式处理,因为它涉及身份验证过程,该过程通常基于电子邮件字段。 通过将用户名参数传递给以下行,web2py 会被告知我们需要用户名字段,并且我们希望使用它来登录而不是电子邮件字段。 它的作用就像一个主键。

auth.define_tables(username = True)

username 被视为唯一值。 在某些情况下,注册可能会超出正常的注册表格。 也有这样的情况,新用户被迫登录,以完成注册。

这可以使用虚拟字段complete_registration来完成,该字段默认设置为False,并在他们更新个人资料时设置为True

auth.settings.extra_fields['auth_user'] = [
   Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}'),
   comment = "i.e. 123-123-1234"),
   Field('address','text'),
   Field('complete_registration',default = False,update = True,
   writable = False, readable = False)
]

auth.define_tables(username = True)

此场景可能希望新用户在登录后完成注册。

db.py中的models文件夹中,我们可以附加以下代码 −

if auth.user and not auth.user.complete_registration:
if not (request.controller,request.function) == ('default','user'):
   redirect(URL('default','user/profile'))

这将强制新用户根据要求编辑其个人资料。

授权

这是向用户授予某些访问权限或某些内容的许可的过程。

在 web2py 中,一旦创建或注册了新用户,就会创建一个新组来包含该用户。 新用户的角色通常称为"user_[id]",其中 id 是用户的唯一标识。

创建新组的默认值为 −

auth.settings.create_user_groups = "user_%(id)s"

可以通过以下方式禁用用户之间组的创建 −

auth.settings.create_user_groups = None

创建、授予特定成员和权限的访问权限也可以在 appadmin 的帮助下以编程方式实现。

部分实现如下 −

Sr.No 命令和使用
1

auth.add_group('role', 'description')

返回新创建的组的ID。

2

auth.del_group(group_id)

删除指定id的组

3

auth.del_group(auth.id_group('user_7'))

删除具有给定标识的用户组。

4

auth.user_group(user_id)

返回与给定用户唯一关联的组的 id 值。

5

auth.add_membership(group_id, user_id)

返回给定group_id的user_id值

6

auth.del_membership(group_id, user_id)

撤销给定member_id(即给定组中的user_id)的访问权限。

7

auth.has_membership(group_id, user_id, role)

检查 user_id 是否属于给定组。

中央身份验证服务 (CAS)

web2py 为内置 web2py 的客户端和服务器提供了一个行业标准,即客户端身份验证服务 – CAS。 它是第三方身份验证工具。

它是分布式身份验证的开放协议。 CAS的工作原理如下 −

  • 如果用户访问该网站,协议会检查用户是否经过身份验证。

  • 如果用户未通过应用程序的身份验证,协议将重定向到用户可以注册或登录应用程序的页面。

  • 如果注册完成,用户会收到一封电子邮件。 除非用户验证电子邮件,否则注册尚未完成。

  • 成功注册后,将使用 CAS 设备使用的密钥对用户进行身份验证。

  • 该密钥用于通过 HTTP 请求获取用户的凭据,该密钥在后台设置。