Laravel认证后重定向到登录名

时间:2018-10-14 06:00:57

标签: php laravel-5.7

问题

我正忙于我的第一个Laravel应用,尽管我看到了编写方式的好处,但是我仍然很难理解其中的某些行为。

当我尝试登录时,我被重定向到登录页面。似乎用户已正确验证身份,但无论如何它都会重定向到登录页面。

我所拥有的

我的用户表如下:

,---------,---------------,---------------,----------------,---------------,-----------,
| user_id | user_username | user_password | user_firtsname | user_lastname | user_type |
|---------|---------------|---------------|----------------|---------------|-----------|
| 1       | me@domain.com | encrypted     | Foo            | Bar           | farmer    |
'---------'---------------'---------------'----------------'---------------'-----------'

这是我的路线文件:

<?php
Route::get('/login', 'UsersController@login');

Auth::routes();
Route::get('/dashboard', 'HomeController@dashboard')->name('dashboard');
Route::get('/users/grid', 'UsersController@grid');
Route::resource('/users', 'UsersController');

LoginController.php

<?php
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * @var string
     */
    protected $redirectTo = '/dashboard';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
     * @return string
     */
    public function username()
    {
        return 'user_username';
    }

    /**
     * @param Request $request
     * @param $user
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function authenticated(Request $request, $user)
    {
        return $user->user_type === 'farmer' ? redirect('/dashboard') : redirect('/admin');
    }
}

User.php

<?php
namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * @var array
     */
    protected $fillable = [
        'user_username', 'user_firstname', 'user_lastname', 'user_password',
    ];

    /**
     * @var array
     */
    protected $hidden = [
        'user_password', 'remember_token',
    ];

    /**
     * @var bool
     */
    public $timestamps = false;

    /**
     * @return mixed|string
     */
    public function getAuthPassword()
    {
        return $this->user_password;
    }

    /**
     * @return string
     */
    public function getKey()
    {
        return $this->user_id;
    }
}

我做了什么

我读过各种questions on stackoverflow,但由于某种原因,我无法登录工作。

我使用php artisan make:auth创建了身份验证。我也尝试阅读文档,但是还是没有运气。

问题

如何在登录后将其重定向到仪表板?我想念什么?

4 个答案:

答案 0 :(得分:0)

昨天晚上我遇到了同样的问题。我发现问题是Auth :: attempt()不能持久保存登录,因此当用户成功登录时,重定向到/ home后在会话中将其丢弃。

下面的链接提供了解决问题的答案: Laravel Auth:attempt() will not persist login

  

尝试添加类似内容

     

protected $primaryKey = 'user_id'; in class User{}

     

(app / models / User.php)

     

(字段user_id是“用户”表中我的架构中的自动增量键)

答案 1 :(得分:0)

  

您需要在用户模型中添加此道具。

protected $primaryKey = 'user_id';
  

从登录控制器中删除authenticated()方法。

并根据RedirectIfAuthenticated中间件中的用户类型处理重定向

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
          if (Auth::guard($guard)->user->user_type === 'farmer'){
            redirect('/dashboard'); // make sure the urls is correct with condition above 
          }
          return redirect('/admin');
        }

        return $next($request);
    }
}
  

App\Exceptions\Handler类中的额外步骤

如果每种用户类型的登录页面不同,请添加此方法

/**
 * @param Request $request
 * @param AuthenticationException $exception
 * @return JsonResponse|RedirectResponse|\Symfony\Component\HttpFoundation\Response
 */
protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }
    if ($request->is('dashboard') || $request->is('dashboard/*')) {
        return redirect()->guest('/dashboard/login');
    }

    return redirect()->guest('farmer/login');
}

答案 2 :(得分:-1)

您使用的是user_password字段,而不是password字段。因此,您需要在LoginController.php文件中进行一些更改。以下是更新后的LoginController。尝试进行这样的更改,然后尝试登录

<?php
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * @var string
     */
    protected $redirectTo = '/dashboard';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
     * @return string
     */
    public function username()
    {
        return 'user_username';
    }

    /**
     * @param Request $request
     * @param $user
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function authenticated(Request $request, $user)
    {
        return $user->user_type === 'farmer' ? redirect('/dashboard') : redirect('/admin');
    }

    /**
     * Validate the user login request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            $this->username() => 'required|string',
            'user_password' => 'required|string',
        ]);
    }

    /**
     * Get the needed authorization credentials from the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'user_password');
    }
}

我添加了两个函数validateLogincredentials,其中默认字段为password。我用user_password进行了更改。

答案 3 :(得分:-1)

要在laravel中进行身份验证,请先使用<label for="urname">Last Name</label> <asp:TextBox ID="txtl_name" runat="server" placeholder="Enter your Last Name" class="text_field" ></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtl_name" ErrorMessage="Last name is a required field" ForeColor="Red"></asp:RequiredFieldValidator> 命令

,并在您的web.php中仅添加具有所有身份验证路由的php artisan make:auth

并检查您是否登录,应在

之类的控制器的构造函数中添加Auth::routes();
$this->middleware('auth');

并且不要忘记像 public function __construct() { $this->middleware('auth'); } 一样调用auth类

或者您可以通过添加中间件auth来检查路由中的身份验证

并检查https://laravel.com/docs/5.7/authentication文档

相关问题