Laravel 5.2 SAML2身份验证持久性问题

时间:2017-05-09 19:02:54

标签: php laravel-5.2 saml-2.0

我已经安装了这个github Laravel 5 Saml2包: https://github.com/aacotroneo/laravel-saml2

我的登录工作正常,身份验证正在进行,数据正在正确传回。我有一个LoginListener成功捕获正确的用户信息并从数据库返回一个有效的用户。但是,当我尝试使用Auth :: login时,它不会在侦听器句柄函数之外持久存在,并且会在SAML身份验证和侦听器之间进入无限循环。

这是我的听众:

namespace App\Listeners;
use \Aacotroneo\Saml2\Events\Saml2LoginEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Auth;
use Illuminate\Session\Middleware\StartSession;
use App\Http\Controllers\HomeController;


class LoginListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
    }
    /**
     * Handle the event.
     *
     * @param  Saml2LoginEvent  $event
     * @return void
     */
    public function handle(Saml2LoginEvent $event)
    {
      $user = $event->getSaml2User();
            $userData = [
                'id' => $user->getUserId(),
                'attributes' => $user->getAttributes(),
                'assertion' => $user->getRawSamlAssertion()
            ];

            //check if email already exists and fetch user
            $user = \App\Models\User::where('username', $userData['attributes']['NameID'][0])->first();
            Auth::guard('web')->login($user);   
            Session::save();        
    }
}

我添加了' web'在我的路由saml2-settings文件中的中间件设置,如多个地方所示,没有任何效果。有人在某个地方有一个可行的例子,我可以深入了解我的错误吗?

1 个答案:

答案 0 :(得分:1)

对此的解决方案原来是在中间件中。我有几个自定义中间件文件设置,他们干扰Web中间件开始解决问题。

为了解决这个问题,我在内核中创建了一个名为listener的自定义中间件组,并删除了我添加到web中的所有额外中间件:

'listener' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    ], 

然后在saml2_settings配置文件中,我将routesMiddleware变量更改为listener:

'routesMiddleware' => ['listener'],

希望这有助于其他人进行故障排除。