在 web2py cas 中发送成员资格

sending memberships in web2py cas

我对使用 Web2py 还很陌生,我正在尝试让 CAS 授权从一台服务器(web2py 实例)到另一台服务器工作。具体来说,我想了解我是否可以在 cas_provider 上为用户分配角色,然后在消费者应用程序上查询这个角色?

我已经设法在 CAS 上创建用户并将他们登录到消费者应用程序,但我想向他们展示依赖于他们在特定组中的成员身份的数据库字段。我有一个解决方法,我在消费者应用程序中创建了组和成员资格,但实际上我想在 CAS 上执行所有这些操作,以避免每次添加新用户时都必须在两个地方进行更改。

在我的在线研究中,我的印象是 CAS 可能出于安全考虑限制发送成员资格,但我真的不明白为什么会这样,因为它已经在发送敏感信息,显然是安全的?

任何建议都会非常有帮助,因为 web2py 的 CAS 部分对于像我这样的初学者来说似乎文档不足。

谢谢。

通过 CAS 登录时,web2py Auth 不提供任何用于在 CAS 提供程序应用程序中检查 roles/permissions 的内置工具。但是,没有什么可以阻止您通过 DAL 访问和查询 CAS 提供程序应用程序数据库。类似于:

import os
cas_db_folder = os.path.join(request.folder, '..', 'appname', 'databases')
cas_db = DAL(cas_db_connection_string, folder=cas_db_folder', auto_import=True)

现在您可以查询 cas_db.auth_usercas_db.auth_groupcas_db.auth_membership table 来获取用户角色。

作为替代方案,如果您有一组简单的角色,您可以考虑将它们存储在 auth_user table 中作为 extra fields(您可以将它们存储在 list:string 字段或作为一组布尔字段)。如果您在 CAS 提供者应用程序和 CAS 消费者应用程序的 auth_user table 中设置相同的额外字段集,这些字段的值将从提供者复制到消费者。请注意,这些字段必须设置为 readable,CAS 提供者才能将它们传递给消费者。此外,为确保在提供商应用程序更新后消费者应用程序中的字段得到更新,请务必在消费者应用程序中设置 auth.settings.update_fields(它应该是您要确保更新的字段名称列表, 包括 "email").

添加额外字段似乎无法正常工作。我已将完全相同的字段添加到 CAS 和消费者应用程序,但消费者并未从 CAS 中获取值。我看不出问题出在哪里,因为电子邮件和用户名都没有问题。我可以看到这些字段是在 Consumer 应用程序上创建的,但它们不是从 CAS 填充的。他们只有 'none' 个完整。

这是 CAS 代码:

db.define_table(
auth.settings.table_user_name,

#User Fields for them to fill in
Field('first_name', length=128, required=False, default=''),
Field('last_name', length=128, required=False, default=''),
Field('username', length=128, required=False, default='', unique=True),
Field('email', length=128, required=False, default='', unique=True),
Field('company', length=256, default=''),
Field('address', length=256, default=''),
Field('city', length=128, default=''),
Field('postcode', length=128, default=''),
Field('country', length=128, requires=IS_IN_SET(COUNTRIES)),
Field('password', 'password', length=512, required=False, readable=False, label='Password'),

#Fields that are for administration purposes
Field('date_created', type= 'datetime', default = request.now, requires = IS_DATETIME(format=('%d-%m-%Y %H-%M-%S GMT')), writable=False),
Field('server_added', type='boolean', writable=False, readable=False, default='False'),
Field('admin_role', type='boolean', writable=False, readable=False, default='False'),
Field('temp_user', type='boolean', writable=False, readable=False, default='False'),

#Fields for web2py internal purposes
Field('registration_key', length=512, writable=False, readable=False, default=''),
Field('reset_password_key', length=512, writable=False, readable=False, default=''),
Field('registration_id', length=512, writable=False, readable=False, default=''),

#This last line states what should be exposed when referencing the table
format='%(username)s  :  %(email)s')

#Setting up Validators
member = db[auth.settings.table_user_name] # get the custom_auth_table
member.first_name.requires = \
IS_NOT_EMPTY(error_message=auth.messages.is_empty)
member.last_name.requires = \
IS_NOT_EMPTY(error_message=auth.messages.is_empty)
member.password.requires = [IS_STRONG(min=5, special=0, upper=0), CRYPT()]
member.email.requires = [
IS_EMAIL(error_message=auth.messages.invalid_email),
IS_NOT_IN_DB(db, 'auth_user.email')]
member.username.requires = IS_NOT_IN_DB(db, 'auth_user.username')

这是消费者代码:

#Use the CAS for authentication
auth = Auth(db, cas_provider = 'http://xxxxxxxxxxxxxxxx')

service = Service()
plugins = PluginManager()

#Add additional field to Auth to accept the ADMIN flag
auth.settings.extra_fields['auth_user']= [
Field('admin_role', type='boolean'),
Field('postcode', length=128, default='')]

## create all tables needed by auth if not custom tables
auth.define_tables(username=False, signature=False)