Web2py访问控制


认证

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

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

看看下面给出的模式。

验证

Auth 定义了以下表格 -

序号 表名称和说明
1 auth_user
存储用户的姓名,电子邮件地址,密码和状态。
2 auth_group
以多对多的结构存储用户的组或角色
3 auth_membership
以多对多的结构存储链接用户和组的信息
4 auth_permission
该表链接组和权限。
5 auth_event
在其他表中记录更改并成功访问
6 auth_cas
它用于中央身份验证服务

定制认证

有两种方法可以自定义身份验证。

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

  • 让web2py定义 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 是额外字段的字典。密钥是要添加额外字段的验证表的名称。该值是额外字段的列表。在这里,我们添加了两个额外的字段,电话 号码和地址

用户名 必须以特殊方式处理,因为它涉及认证过程,通常基于电子邮件字段。通过将用户名参数传递给下面一行,它会通知web2py我们需要用户名字段,我们希望将它用于登录而不是电子邮件字段。它起着主键的作用。

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提供了一个行业标准,即Client Authentication Service - 用于客户端和服务器内置web2py的CAS。它是第三方认证工具。

它是分布式验证的开放协议。CAS的工作如下 -

  • 如果用户访问该网站,则该协议检查用户是否被认证。

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

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

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

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