Laravel Web 認證

tim-laravel發表於2020-01-03

Laravel 自身的web認證路由預設包括登入、註冊和密碼重置,除了登入之外,其它都是可以根據需求選擇要還是不要,很靈活。

預設生成的web認證路由

Auth::routes();

需要郵箱驗證的

Auth::routes(['verify' => true]);

不需要註冊功能

Auth::routes(['register' => false]);`

不需要重置密碼

Auth::routes(['reset' => false]);

登入成功以後,預設跳轉至 /home 路徑下,可以通過新增下面的方法,來修改預設跳轉路徑:

protected function redirectTo()
{
    return '/test';
}

當然也可以修改 App\Providers\RouteServiceProvider 類中的 HOME 常量:

public const HOME = '/test';

獲取登入成功以後的資訊

// 獲取登入使用者例項
$user = Auth::user();
$user = auth()->user();
// use Illuminate\Http\Request;
$user = $request->user();
// 獲取登入使用者id
$id = Auth::id();
$id = auth()->id()
// 驗證使用者是否已登入,適合使用中介軟體驗證
if(Auth::check()) {
    // 已登入
}

新增認證條件

Route::get('profile', function () {
    // 只有認證使用者才可以進來
})->middleware('auth');

// 或者在控制器中的建構函式中指定
// 執行該控制器中所有的動作必須都是經過認證的使用者
public function __construct()
{
    $this->middleware('auth');   
}
// 執行該控制器中除了index和show之外的動作必須都是經過認證的使用者
public function __construct()
{
    $this->middleware('auth')->except(['index', 'show']);    
    // 或者
    // $this->middleware('auth', ['except' => ['index', 'show]]);
}
// 執行該控制器中edit和update動作必須是經過認證的使用者
public function __construct()
{
    $this->middleware('auth')->only(['edit', 'update']);    
    // 或者
    // $this->middleware('auth', ['only' => ['edit', 'update]]);
}

登出

Auth::logout();

手動認證使用者

// 當不想用自帶的控制器去認證使用者,可以自己手動認證
use Illuminate\Http\Request;
use Auth;
class LoginController extends Controller
{
    public function authenticate(Request $request)
    {
        $credentials = $request->only('email', 'password);
        if(Auth::attempt($credentials)) {
            // Authentication passed ...
        }
    }
}
// Route::post('/authenticate', 'Auth\LoginController@authenticate');

if(Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // 欄位 active 必須是 1
}

記住使用者

// $remember 是個 bool 值
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // the user is being remember... 內建的 LoginController 已實現 remember
}

Auth::login($user);
Auth::login($user, true);   // 記住使用者
Auth::loginUsingId(1);
Auth::loginUsingId(1, true);  // 記住使用者
Auth::once($credentials);   // 臨時認證, 無狀態的

無登入頁面,利用彈窗請求認證使用者

// auth.basic 中介軟體,訪問需要認證的路有時候,如果還未認證,則瀏覽器會彈出一個登入認證的彈窗
Route::get('profile', function() {
    dump(auth()->user());
})->middleware('auth.basic');

單裝置登入

// 取消登入在別的裝置上的認證
// 實現:
// 在 App\Http\Kernel::class 中取消註釋: \Illuminate\Session\Middleware\AuthenticateSession::class,
Route::get('/out', function () {
    Auth::logoutOtherDevices($password);  // 傳入當前登入使用者的密碼 123456
})->middleware('auth');
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章