我正忙于我的第一个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
创建了身份验证。我也尝试阅读文档,但是还是没有运气。
如何在登录后将其重定向到仪表板?我想念什么?
答案 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');
}
}
我添加了两个函数validateLogin
和credentials
,其中默认字段为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来检查路由中的身份验证