我使用Laravel 5.4及其內置的Auth API。我在users
表中添加了一個名爲is_admin
的列。我想修改登錄過程,以便登錄僅在is_admin == 1
時有效。我查看了Illuminate\Foundation\Auth\AuthenticatesUsers.php
(Github),我可能會在那裏做一些改變,但如果可能的話,我寧願不打擾核心。有沒有更優雅的方式來做到這一點?Laravel auth在登錄之前檢查列
回答
我解決這與類似@Sagar的解決方案阿羅拉的。在運行artisan make:auth
時創建的app\Http\Controllers\Auth\LoginController.php
中,我忽略了AuthenticatesUsers
中的attemptLogin
方法。這是代碼在LoginController.php
:
protected function attemptLogin(Request $request)
{
return (auth()->attempt(['email' => $request->email, 'password' => $request->password, 'is_admin' => 1]));
}
與is_admin == 1
現在只有用戶也將登錄
您可以創建你的登錄功能:
if (Auth::attempt(['email' => $email, 'password' => $password, 'is_admin' => 1])) {
// The user is active, not suspended, and exists.
}
您與其他字段檢查這裏的手動登錄過程:
https://laravel.com/docs/5.4/authentication#authenticating-users
因此,在您登錄功能,你可以通過檢查這謝謝
我認爲一個更好的方法是實際上允許所有用戶登錄。然後通過admin
限制訪問中間件。這樣你可以將這個中間件應用到任意數量的路由中。
在
Route::group(['middleware' => 'admin'], function() {
// auth protected routes
});
這樣通過包裝必要途徑使用它創建app\Http\Middleware\RedirectIfNotAdmin
:
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfNotAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user = $request->user();
if ($user && $user->is_admin) {
return $next($request);
}
return redirect('/');
}
}
然後在app\Http\Kernel.php
你把它添加到$routeMiddleware
屬性:
protected $routeMiddleware = [
// ... other middlewares
'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class
];
謝謝。你說你認爲這更好 - 爲什麼(只是好奇)?例如,我的意思是爲什麼不創建一個名叫「admin」的新衛隊。 – GluePear
@GluePear好的,一名警衛也可以解決這個問題。但是,如果使用'admin'後衛,那麼假設使用相同的'session'驅動程序,則需要創建整個'admins'表和模型。我認爲將用戶保存在一張表中是一種很好的做法,因此隨着應用程序的增長,您只需添加權限/角色。所以是使用警衛是一種解決方案。但在這種情況下,我會說這是相當大膽,然後優雅。 –
@GluePear我還會補充一點,有時候有幾個用戶表也可以。例如,當你讓後臺站點只能用於管理員時。但認爲它仍然可以在一張桌子內完成。聽到其他方法會很高興 –
就像你提到的,你永遠不應該觸及核心文件。但是如果你能看到laravel已經在LoginController上添加了AuthenticatesUsers
作爲trait
這意味着你可以簡單地通過覆蓋它在LoginController中加入credentials()
就像下面這樣。
/**
* Get the needed authorization credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
{
return [
'email' => $request->input('email'),
'password' => $request->input('password'),
'is_admin' => 1
];
}
有趣。我不知道這是否比我的回答更好(在LoginController中重寫'attemptLogin')。 – GluePear
該解決方案可能不夠優雅,但仍然有效。
一下添加到LoginController
:
protected function authenticated(Request $request, $user)
{
if (! $user->is_admin) {
Auth::logout();
return redirect('login')->withErrors(['is_admin' => 'Only admin users may log in']);
}
}
然後把這個auth/login.blade.php
:
@if($errors->has('is_admin'))
<div class="alert alert-danger" role="alert">{{ $errors->first('is_admin') }}</div>
@endif
也請記住,你應該禁用寄存器功能,因爲註冊用戶仍登錄後。
- 1. 檢查另一列上登錄使用缺省auth上Laravel 5
- 2. 在laravel auth中間件之前檢查會話變量
- 3. Laravel Auth - 重定向登錄
- 4. 登錄之前檢查用戶狀態
- 5. CodeIgniter Ion-Auth檢查是否登錄
- 6. Cartalyst/Sentinel Laravel 5.4 - 在登錄用戶之前檢查數據庫字段
- 7. 登錄之前提交表單Laravel 4
- 8. 登錄前檢查字段
- 9. laravel 5.1 auth登錄返回錯誤
- 10. 不能持久Auth ::登錄Laravel 5
- 11. 在Laravel更新之前查看記錄
- 12. 之前登錄
- 13. Auth ::如何在Laravel中檢查密碼?
- 14. Nodejs檢查用戶在前端登錄
- 15. Facebook JS SDK:在登錄PopUp之前檢查權限
- 16. Yii2檢查用戶是否在每頁之前登錄
- 17. 在當前域名之外檢查WordPress登錄
- 18. 檢查用戶是否在模板加載之前登錄
- 19. 檢查用戶是否在Google+之前登錄應用程序?
- 20. 流星 - 在渲染模板之前檢查登錄狀態
- 21. Laravel 5檢查用戶是否登錄
- 22. 檢查用戶是否登錄laravel 4
- 23. 檢查用戶仍在登錄而不重置AUTH超時
- 24. ember簡單auth:登錄後重定向到之前的路由
- 25. 在登錄事件之前
- 26. Github在推之前登錄
- 27. Android檢查用戶登錄之前,否則啓動登錄活動
- 28. Laravel 5.2使用Laravel Auth組件和AngularJS登錄
- 29. Laravel auth檢查字段是否爲空
- 30. Laravel auth檢查所有頁面
覆蓋實現AuthenitacesUsers的類中的函數。 – devk
你可以爲此做一箇中間件? –