- Web2py 教程
- Web2py - 首页
- Web2py - 简介
- Web2py - Python 语言
- Web2py - 框架概述
- Web2py - 核心
- Web2py - 视图
- Web2py - 数据库抽象层
- Web2py - 表单 & 验证器
- Web2py - 邮件 & 短信
- Web2py - 访问控制
- Web2py - 服务
- Web2py - 添加 Ajax 效果
- Web2py - 组件
- Web2py - 部署
- Web2py - 安全性
- Web2py 有用资源
- Web2py - 快速指南
- Web2py - 有用资源
- Web2py - 讨论
Web2py - 访问控制
身份验证
几乎每个应用程序都需要能够对用户进行身份验证并设置权限。web2py 带有一个广泛且可自定义的基于角色的访问控制机制。它还支持 CAS、OpenID、OAuth 1.0、LDAP、PAM、X509 等协议。
web2py 包含一个称为基于角色的访问控制机制 (RBAC) 的机制,这是一种将系统访问权限限制为授权用户的策略。实现 RBAC 的 web2py 类称为 Auth。
请查看以下架构。
Auth 定义了以下表格 -
序号 | 表名 & 描述 |
---|---|
1 | auth_user 存储用户的姓名、电子邮件地址、密码和状态。 |
2 | auth_group 以多对多结构存储用户的组或角色 |
3 | auth_membership 以多对多结构存储用户和组链接的信息 |
4 | auth_permission 该表链接组和权限。 |
5 | auth_event 记录其他表中的更改和成功访问 |
6 | auth_cas 用于中央认证服务 |
自定义 Auth
有两种方法可以自定义 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必须以特殊方式处理,因为它参与了身份验证过程,该过程通常基于电子邮件字段。通过将 username 参数传递到以下行,它会通知 web2py 我们想要 username 字段,并且我们希望将其用于登录而不是电子邮件字段。它充当主键。
auth.define_tables(username = True)
用户名被视为唯一值。在注册发生在正常注册表单之外的情况下可能会出现这种情况。同样,新用户也可能被迫登录以完成注册。
这可以通过使用一个虚拟字段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 的帮助以编程方式实现。
一些实现列出如下 -
序号 | 命令 & 用法 |
---|---|
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 提供了一个行业标准,即客户端认证服务 - CAS,用于在 web2py 中构建的客户端和服务器。它是一个第三方身份验证工具。
它是一种用于分布式身份验证的开放协议。CAS 的工作原理如下 -
如果用户访问网站,该协议会检查用户是否已通过身份验证。
如果用户未通过应用程序的身份验证,则该协议会重定向到用户可以在其中注册或登录应用程序的页面。
如果注册完成,用户会收到一封电子邮件。除非用户验证电子邮件,否则注册不完整。
注册成功后,用户将使用 CAS 设备使用的密钥进行身份验证。
该密钥用于通过在后台设置的 HTTP 请求获取用户的凭据。