我有两个web2py应用程序(cas_provider,cas_consumer)。
在cas_consumer中,我将auth设置为使用cas_provider作为cas_provider:
auth = Auth(db, cas_provider='http://localhost:8000/cas_provider/default/user/cas', host_names=configuration.get('host.names'))
在cas_provider中,我将以下代码添加到db.py中,以便在用户登录时发送电子邮件:
auth.settings.login_onaccept.append(lambda form: mail.send(to='you@example.com', subject='new user',
message='user email is %s'%form.vars.email))
如果我转到http://localhost:8000/cas_provider/default/user并直接登录到提供商,则web2py记录它尝试发送电子邮件。但是,如果我转到http://localhost:8000/cas_consumer/default/user并通过使用者登录,则似乎没有调用login_onaccept函数。
出现这种情况的原因是,当我通过消费者登录时,Auth调用cas_login(version=2)
依次调用self.login(next, onvalidation, cas_onaccept, log)
。其中 cas_onaccept 是 cas_login 中定义的函数。由于提供了onaccept参数(即^ = DEFAULT),因此self.login不会获取db.py中定义的settings.login_onaccept设置。
注意:auth.settings.login_onfail似乎在两种情况下都可以工作。
我是否缺少某些东西,或者这是通过cas_login处理login_onaccept的方式的错误吗?
答案 0 :(得分:0)
这可能是一个错误,请随时提交问题,但是目前,一种解决方法是在提供程序应用程序的Auth操作中添加一些逻辑。例如:
def user():
if request.args(0) == 'cas' and request.args(1) == auth.settings.cas_actions['login']:
return auth.cas_login(onaccept=auth.settings.login_onaccept[0])
return auth()
上面的代码拦截CAS登录请求,并将所需的onaccept
回调显式传递给cas_login
。请注意,onaccept
的{{1}}参数必须是一个函数而不是函数列表,因此cas_login
中的[0]
下标(如果auth.settings.onaccept[0]
是一个列表如果有多个元素,则需要创建一个包装函数,以调用列表中的每个函数,并将包装作为参数auth.settings.login_onaccept
传递。