通过CAS Consumer登录时未执行login_onaccept操作

时间:2019-10-02 19:24:10

标签: web2py

我有两个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的方式的错误吗?

1 个答案:

答案 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传递。

相关问题