这是我的问题 . 当我使用登录表单登录时,我的用户可以在应用程序中导航而不会出现已保存会话的问题 .
我要做的是创建一个不使用凭据登录的不同路径 . 例如,转到 /login_for_mike
,我使用用户名存储会话(绕过任何登录),然后将它们重定向到主页 .
奇怪的是,在重定向上,会话是明确的,并将我踢出应用程序 .
现在,如果我第二次回到 /login_for_mike
. 似乎 Session 已经创建,我很好 .
第一次重定向的某些内容并没有延续我的会话,事实上,它会创建一个新会话,然后它会持续存在 .
有没有我缺少的东西,或者当我打开那条开放路线时Laravel第一次跳过的东西?
以下是我们处理登录的方式:
1)用户提交登录表单 . 2)我们通过检查我们的ldap服务器来处理表单 . 如果suucessful,我们存储会话变量user . 然后我们重定向到主页 . 如果未设置会话变量(中间件) - 将用户踢到登录页面 .
其他路径:1)使用不同的路由,我们绕过ldap检查和登录表单 . 2)我们使用与上面相同的代码,但是当我们存储会话时,中间件检查会话并且它是完全清楚的并且将用户踢到登录表单 . 3)现在如果我再次点击此路线,它会检查会话并且用户在那里!他们可以继续
看来,当我点击登录表单时发生了不同的事情,当我绕过表单时就不会发生这种情况 .
这是伪代码:
Routes:
Route::post('ldap', 'LdapController@ldap'); //Form posts here
Route::get('login_for_mike', 'LdapController@bypass_login');
LdapController
function ldap() {
process_ldap($request->input('email'), $request->input('password')); //Works perfectly
}
function bypass_login() {
process_ldap('mike@email.com', 0, 1);
}
function process_ldap($user,$pass,$bypass=false)
{
if (!$bypass)
{
$return = check_with_ldap_if_this_valid($user,$pass);
if (!$return)
Redirect::to('/login')->withErrors('Wrong credentials')->send();
}
Session::put('user', $user);
Redirect::to('home-page')->send(); //This works when entering through /login/for/mike but fails on middleware for session check
}
Middleware that fails when entering through /login_for_mike
But works if I try to hit it again after the first fail
public function handle($request, Closure $next)
{
$user=Session::get('user'); //No session when entering though /login_for_mike
if(!$user){
return redirect('login');
}
return $next($request);
}
2 回答
正如我们所讨论的那样,理论上你的逻辑是合理的,但你需要确保控制器最终返回一些东西 .
因此,我会将您的代码重写为:
(虽然由于我无法完全重现您的问题,但我无法解释这是如何直接导致您的问题,但是您的逻辑确实有意义,所以如果您按照应该使用的方式调用所有内容,它应该可以工作 . )
这不太可能,但我之前看到过一次很难调试登录问题 . send()方法是刷新输出,这可能告诉浏览器在会话写入文件之前启动另一个连接 . 在编写会话时,会从浏览器发送下一个请求,会话被非正式地反序列化,并且您的会话中根本没有任何内容,完全空白 . 无论您是否返回登录麦克风,下一个请求都应该从初始请求中正确读取会话 .
在登录页面上测试此var_dump $ _SESSION() .
要么
在任何重定向send()之前添加session_write_close() .