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。
    • 从头开始定义自定义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是额外字段的字典。键是要向其添加额外字段的身份验证表的名称。该值是额外字段的列表。在这里,我们添加了两个额外的字段,phone_number 和 address
    用户名必须以特殊方式处理,因为它涉及通常基于电子邮件字段的身份验证过程。通过将用户名参数传递给下一行,它会通知 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的模型文件夹中,我们可以附加以下代码 -
    
    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,角色)
    检查 user_id 是否属于给定的组。
  • 中央认证服务 (CAS)

    web2py 为客户端和服务器内置的 web2py 提供了一个行业标准,即客户端身份验证服务 – CAS。它是第三方身份验证工具。
    它是一种用于分布式身份验证的开放协议。CAS 的工作如下 -
    • 如果用户访问网站,协议会检查用户是否经过身份验证。
    • 如果用户未通过应用程序的身份验证,协议将重定向到用户可以注册或登录应用程序的页面。
    • 如果注册完成,用户会收到一封电子邮件。除非用户验证电子邮件,否则注册不会完成。
    • 成功注册后,用户将使用 CAS 设备使用的密钥进行身份验证。
    • 密钥用于通过后台设置的 HTTP 请求获取用户的凭据。