规则模块未获取(外部)“用户登录”信息事件?
在我的安装中,用户使用 Shibboleth [1] 登录,但我设置的在“用户已登录”事件上执行的规则 [2] 并未执行。
另一方面,当我通过正常的 Drupal 方式以管理员身份登录时,规则就会被执行。
这是否意味着外部登录事件根本不被处理?
有办法克服这个问题吗?
In my installation the users login with Shibboleth [1], but the rule [2] I've set up to be executed on "User has logged in" event, isn't executed.
On the other hand, when I login as administrator through the normal Drupal way, the rule is executed.
Does this mean that the external login event isn't handled at all?
Is there a way to overcome this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这似乎是 Shibboleth 模块的错误,所以登录“事件”确实是不是由它引发的(在 Drupal 术语中,它不会使用
$op = 'login'
调用hook_user()
)。查看 Shibboleth code 中,登录似乎发生在其
hook_init()
实现中:因此您需要对此进行修补并确保调用
user_module_invoke()
。标准方法是调用user_authenticate_finalize()
< /a> 成功登录后(这将依次调用user_module_invoke()
),因此您需要在user_external_login_register()
调用之后添加该内容:注意:未经测试的代码,谨防拼写错误和其他愚蠢的疏忽;)
如果您最终这样做,您可能希望将其作为上面链接的错误报告的补丁提交。 (显然,前提是它有效;)
This seems to be a bug of the Shibboleth module, so the login 'event' is indeed not raised by it (in Drupal terms, it does not invoke
hook_user()
with$op = 'login'
).Looking at the Shibboleth code, the login seems to happen in its
hook_init()
implementation:So you'd need to patch this and and ensure that
user_module_invoke()
is called. The standard way to do this would be to calluser_authenticate_finalize()
after a successful login (which will in turn calluser_module_invoke()
), so you'd add that after theuser_external_login_register()
call:NOTE: Untested code, beware of typos and other stupid oversights ;)
Should you end up doing this, you might want to submit it as a patch to the bug report linked above. (only if it works, obviously ;)
在这些情况下,Drupal 加载模块的顺序非常重要。您需要设置规则,以便在身份验证模块之后加载它。例如,对于 ldap_integration,
“20”是一个比您的身份验证模块更大的任意数字。
The order in which Drupal loads the modules is very important in these cases. You will need to set rules so that it is loaded after your authentication module. For instance, with ldap_integration
"20" is an arbitrary number that is bigger than whatever your authentication module is.
Drupal 运行
hooks
,这意味着模块有机会运行一段代码。例如,登录时调用 hook_user。很多时候,模块会在此类挂钩中调用
drupal_goto()
。这会严重破坏。 Drupal_goto 将杀死所有内容,发送重定向标头,然后终止应用程序。不会运行其他钩子。您可以通过安装 devel 模块并切换设置“显示重定向”来找到任何“非法”转到,您将看到例如 sibbletooth 是否调用了不应调用的重定向。
Drupal runs
hooks
, meaning modules get the chance to run a piece of code. E.g. on login a hook_user is called.Too often, modules will call a
drupal_goto()
inside such hooks. This will break severely. Drupal_goto will kill everything, send a redirect-header, then die the application. No other hooks will be ran.You can find any "illegal" goto's by installing devel module and toggling the setting "show redirects", you will see if e.g. sibbletooth invoked a redirect where it should not have.