【问题标题】:Authenticate user on constructor在构造函数上验证用户
【发布时间】:2017-02-07 21:23:02
【问题描述】:

我想通过任何 url 中的令牌执行身份验证。在路由之前调用此身份验证,并且令牌存储在用户表中(字段token)。

访问URLmysite.com/backend/?token=XXX&anyparam=any时,如果token有效,用户应该被重定向到mysite.com/backend/?anyparam=any

我正在尝试对 Controller 的构造函数执行身份验证,因此如果 URL 具有有效的令牌(与用户的令牌匹配),则应该对用户进行身份验证。

public function __construct(Request $request)
{
    // url with token
    if($request->has('token')) {
        $new_url = $request->url() . '/?' . http_build_query($request->except(['token']));

        $user = User::where('token', $request->input('token'))->first();

        Auth::login($user);
        //dd(Auth::user()); // says the user is authenticated
        return redirect($new_url)->send();
    }
}

但是,在重定向之后,用户不再经过身份验证。

我错过了什么?

另外,生成令牌的过程与此问题无关。

【问题讨论】:

  • __constructs 没有返回值。他们总是返回void。话虽如此,由于您使用令牌对用户进行身份验证,我只能假设您还使用一些包来处理令牌生成。如果是这种情况,则需要更多信息。
  • 您能描述一下您需要在构造中进行身份验证的原因吗?可能,还有另一种解决方案
  • @Andrew 检查已编辑的问题。

标签: php laravel authentication laravel-5.2


【解决方案1】:

我认为最好的解决方案是使用中间件。如果出于某种原因,您希望它成为__construct 的一部分,您可以按照the documentation 中的说明从控制器调用中间件。

所以,你的控制器应该是这样的:

public function __construct(Request $request)
{
    $this->middleware('auth');
}

而 Auth 中间件(Authenticate 类)会有类似的东西:

public function handle($request, Closure $next, $guard = null)
{
    if($request->has('token')) {
        $new_url = $request->url() . '/?' . http_build_query($request->except(['token']));
        $user = User::where('token', $request->input('token'))->first();

        if (is_object($user)) {
            Auth::login($user);

            return redirect()->to($new_url);
        }
    }

    return $next($request);
}

如果你不想惹auth,你可以随时创建another middleware

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多