我是使用Web2py的新手,我试图让CAS授权从一个服务器(web2py实例)到另一个服务器(web2py实例)。具体来说,我试图了解我是否可以在cas_provider上为用户分配角色,然后在消费者应用程序上进行查询?
我已经设法在CAS上创建用户并将其登录到消费者应用程序,但我想向他们展示数据库的字段,这些字段取决于他们对特定组的成员身份。我有一个解决方法,我在消费者应用程序中创建了组和成员资格,但我真的想在CAS上完成所有这些操作,以避免每次添加新用户时都必须在两个地方进行更改。
在我的网上研究中,我得到的结论是,由于安全问题,CAS可能会限制发送会员资格,但我真的不明白为什么会这样,因为它已经发送了敏感信息,显然是安全的?
任何建议都会非常有用,因为对于像我这样的初学者来说,web2py的CAS部分似乎没有记录。
感谢。
答案 0 :(得分:1)
通过CAS登录时,web2py Auth
不提供任何内置工具来检查CAS提供商应用中的角色/权限。但是,没有什么能阻止您通过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_user
,cas_db.auth_group
和cas_db.auth_membership
表以获取用户角色。
作为替代方案,如果您有一组简单的角色,可以考虑将它们作为extra fields存储在auth_user
表中(您可以将它们存储在list:string
字段中一组布尔字段)。如果在CAS提供程序应用程序和CAS使用者应用程序中的auth_user
表中设置了相同的一组额外字段,则这些字段的值将从提供程序复制到使用者。请注意,必须将字段设置为readable
,CAS提供程序才能将其传递给使用者。此外,为了确保在提供者应用程序中更新后消费者应用程序中的字段更新,请务必在消费者应用程序中设置auth.settings.update_fields
(它应该是您要确保更新的字段名称列表,包括"电子邮件")。
答案 1 :(得分:0)
添加额外的字段似乎无法正常工作。我已经向CAS和消费者应用添加了完全相同的字段,但消费者没有从CAS中获取值。我无法看到问题所在,因为电子邮件和用户名都很好。我可以看到这些字段是在Consumer应用程序上创建的,但它们不是从CAS填充的。他们只是没有'没有entires。
这是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)