我遇到了一个问题:在会话过期时自动注销用户 。我试图模仿SugarCRM中的行为,一旦你的会话过期,一个警告告诉你你已经注销,你重定向到登录屏幕重新登录。 无论是否有用户互动,都会发生这种情况。
到目前为止,在yii2中,用户必须事先执行请求。会话可能已过期,但页面将保持不变,直到用户尝试执行新请求。处理此请求时,应用程序可以使用控制器筛选器或beforeAction()
挂钩检查。
我想在会话到期后立即将其重定向到登录页面。我如何自动?
答案 0 :(得分:5)
上述所有答案都是有效的,除了......你必须以另一种方式实施会议。
对服务器的任何调用都将基本重置您的正常会话。通过检查您仍然登录的每x秒,您将完成它,以便您永远不会登出。在每次检查呼叫时,您的会话到期时间将重置。
因此,必须结合您将修改会话处理方式的事实。您希望在实际的页面导航中重置会话计时器,而不是默认情况下PHP处理它。
答案 1 :(得分:1)
SugarCRM必须定期使用一些javascript(ajax请求)检查会话,检查Chrome中DevTool的“网络”选项卡上的XHR,您将在注销警报之前看到此调用。
答案 2 :(得分:1)
用户组件应如下所示:
'user' => [
'identityClass' => 'app\models\User',
'authTimeout' => 300,
'enableAutoLogin' => false, // !important to set this
],
authTimeout
我遇到了同样的问题。我想动态设置用户authTimeout
,我还希望用户在时间到期后自动注销并重定向到登录屏幕(无论是否有用户交互)。这就是我做到的。我已将用户authTimeout
和会话超时设置为config/web.php
中的相同值,并且我还注册了一个新的元标记,该标记将在会话到期后5秒刷新页面,因此它将自动重定向登录屏幕。
在config / web.php中:
'on beforeRequest' => function ($event) {
$user = Yii::$app->user;
if (!$user->isGuest) {
if (!empty(Yii::$app->params['settings']['security_timeout'])) {
$user->authTimeout = intval(Yii::$app->params['settings']['security_timeout']);
Yii::$app->session->set($user->authTimeoutParam, time() + $user->authTimeout);
Yii::$app->view->registerMetaTag(['http-equiv' => 'refresh', 'content' => $user->authTimeout + 5]);
}
}
},
当然,如果您不想动态设置authTimeout
,这会更简单。
authTimeout
只需在您的布局或产品中的任何位置注册元标记,并将刷新时间设置为略高于authTimeout
。
Yii::$app->view->registerMetaTag(['http-equiv' => 'refresh', 'content' => Yii::$app->user->authTimeout + 5]);
答案 3 :(得分:0)
这里是一个非常简单的示例,说明如何使用JavaScript定期进行ajax调用以检查用户是否仍然登录。这假设您的后端PHP脚本返回特定格式的{" loggedin& #34;:true / false}并且你的ajax()函数有三个我在下面实际使用的参数,所以你必须修改语法以使其符合你的需要并满足你实际使用的任何ajax函数(比如jQuery,本机JS,无论你使用什么)......
var checkLogin = function() {
//// presumes that you have some ajax function going
//// with something like ajax(method,url,callback)
//// and that it's returning something like {loggedin:true/false}
ajax("GET", "some-check-login-script.php", function(json) {
var data = JSON.parse(json);
if (!data.loggedin) {
runSomeFunctionToAlertOrRefreshOrWhatever();
clearInterval(logincheckinterval);
}
});
}
var logincheckinterval = setInterval(checkLogin, 5000);
您只需修改语法以匹配您的特定框架对进行该ajax调用的要求,然后相应地修改其余部分以执行您想要执行的操作(警报,提示,自定义)对话,无论如何,一旦它抓住了一个错误的'从返回的数据中返回值。
希望有所帮助。
答案 4 :(得分:0)
之前我在Yii2应用程序上执行了相同的任务,这就是我所做的。
使用js setInterval创建小部件并将其插入主布局。
class UserTimeout extends Widget { public $checkUrl = ['/index/check-user-timeout']; public $redirectUrl = ['/index/login'];}public function run() { $timeout = \Yii::$app->user->authTimeout * 1000 + 5000; // milliseconds $url = Url::to($this->checkUrl); $redirect = Url::to($this->redirectUrl); $this->view->registerJs(" function checkUserTimeout() { $.post('{$url}', function(data){ if(data){ document.location = '{$redirect}'; } }); } setInterval(checkUserTimeout, $timeout); "); }
关闭用户组件中的autoLogin:
{{1}}
坦率地说,我使用事件yii \ web \ Application'afterRequest'创建它,因为我需要通过cookie自动启用其他请求。
制作'index / check-user-timeout'动作:
'components' => [ 'user' => [ 'enableAutoLogin' => false, 'authTimeout' => 60 * 60,
在此操作之前避免检查用户身份非常重要(请勿在beforeAction()或相关事件中执行此类操作:“if(Yii :: $ app-> user-> isGuest)”) - 这将刷新会话过期值。