【问题标题】:Laravel 5.2 authentication with custom routesLaravel 5.2 使用自定义路由进行身份验证
【发布时间】:2016-09-15 13:18:20
【问题描述】:

我正在使用 Laravel 5.2 进行网络项目

我的用例很简单: 在呈现任何页面之前,请验证用户是否已通过身份验证。如果没有,请提供带有自定义身份验证的登录表单(不是 Eloquent 的默认内容)

在阅读了这个场景后,我有:

// routes.php
Route::get('/', 'HomeController@index');

然后,如果我想保护我的所有页面,我需要在控制器的构造函数中使用中间件 auth。如果我想在提供任何页面之前请求登录用户,我的所有控制器都应该遵循相同的模式。

// app/Http/Controllers/HomeController.php
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;

class HomeController extends Controller
{
  public function __construct()
  {
      $this->middleware('auth');
  }

  public function index()
  {
      return view('home');
  }
}

到目前为止,一切都很好。如果我在“/”访问我的应用程序,我将被重定向到 /login 页面。

我创建了登录页面:

// views/auth/login.blade.php
@extends('layouts.app')

@section('content')
    <form class="form-signin" method="post" action="{{ url ('/login') }}">
        {!! csrf_field() !!}
        <h2 class="form-signin-heading">Please sign in</h2>
        <label for="inputUsername" class="sr-only">Username</label>
        <input type="text" id="inputUsername" class="form-control" placeholder="Username" name="username" required autofocus>
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" id="inputPassword" class="form-control" placeholder="Password" name="password" required>        
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </form>

@endsection

请注意重定向到 /login 的表单的操作。 然后我通过提供以下新路由来更新 routes.php:

// Authentication Routes...
Route::get('login', 'Auth\AuthController@showLoginForm');
Route::post('login', 'Auth\AuthController@login');
Route::get('logout', 'Auth\AuthController@logout');

Route::get('/', 'HomeController@index');

通过这些新路由,我正在捕捉登录/注销场景并分配 AuthController 的方法来处理它们。

在已经实现的 AuthController 上,我想我需要定义这些方法。

我无法使其正常工作,或者我可能以错误的方式进行此自定义身份验证。

我有:

// app/Http/Auth/AuthController.php
<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    use AuthenticatesAndRegistersUsers, ThrottlesLogins;
    protected $redirectTo = '/';

    public function __construct()
    {
        $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
    }

    // ... lot of default stuff ..

    protected function login($data)
    {
        //
        // do custom login authentication with $data
        // ie: validate thru a web service or something
        //

        return redirect()->intended('/');
    }
}

关于如何实现这一点有什么建议吗?

【问题讨论】:

  • 你不必写任何东西......那些方法(登录和注册已经在那里......它们在 AuthController 中不可见,但 AuthController 正在扩展 Auth 类。如果你写登录和注册的自定义方法将覆盖它们!
  • 也许我不清楚。我想针对我自己的服务实施自定义身份验证。我的问题是我在哪里实现这个?此外,如果您检查上面的示例 AuthController 类不会扩展 Auth 类

标签: php laravel authentication laravel-5.2 laravel-routing


【解决方案1】:

将您的登录功能更改为

protected function login(Request $data)
{
    //
    // do custom login authentication with $data
    // ie: validate thru a web service or something
    //

    return redirect()->intended('/');
}

这会覆盖 Illuminate\Foundation\Auth\AuthenticatesUsers 最初由 Laravel Auth 使用的函数

【讨论】:

  • 好吧,现在我可以接收请求并使用我自己的服务处理它,但是我应该返回什么?我是否需要在会话上设置一些东西才能使它起作用?在按照描述实现登录方法后,我再次被路由到 /login。
  • @aldoforce 这超出了您原始问题的范围,因为您决定放弃 laravel 默认身份验证并创建自定义您最好有一个游戏计划
  • @lewis4u 在我更改登录方法以处理请求后,我能够获取用户名和密码,以便我可以使用自己的服务对其进行验证。问题在于redirect()-&gt;intended('/')。我总是被重定向到 /login 页面,所以无论我重定向到哪里,似乎我需要在会话或 Auth 类上设置一些变量来明确声明用户身份验证有效并且他可以继续浏览应用程序作为登录用户。
  • @sef4eg 我的计划是使用我自己的机制对用户进行身份验证。验证用户凭据后,我想告诉 laravel 用户可以以登录用户的身份与应用程序交互,但 redirect()-&gt;intended('/') 总是提示 /login 页面。似乎我需要设置一些东西来明确声明用户已正确通过身份验证,但我不知道它是什么。
【解决方案2】:

感谢所有回答此问题的人。我最终推出了自定义集成,其中用户在 Eloquent 的用户模型和我的外部服务上重复。

不幸的是,由于 Laravel 5.2 缺乏相关文档和自定义身份验证方法,这使得它成为一个补丁解决方案,直到出现更稳定的东西。

感谢和愉快的编码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 2016-05-28
    • 1970-01-01
    • 2019-11-19
    • 2017-07-04
    • 2017-05-10
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多