(2020-04-24 Laravel7.0対応)
認証
認証後のリダイレクト先や処理をカスタマイズできる。
```php
$user = Auth::user(); // 現在認証されているユーザーの取得
$id = Auth::id(); // 現在認証されているユーザーのID取得
$request->user() // 認証済みユーザーのインスタンスを返す
Auth::check() // 現在のユーザーが認証されている場合true
Auth::attempt(['email' => $email, 'password' => $password]) // 認証を行い、成功した場合true
Route::get(...)->middleware('auth') // ルート定義で使用
$this->middleware('auth') // コントローラのコンストラクタで使用
middleware('auth:api') // ガードを指定
return redirect()->intended('dashboard'); // 認証フィルターにかかる前にアクセスしようとしていたURLへリダイレクトさせる。リダイレクトが不可能な場合は指定されたURIへ
Auth::logout(); // ログアウト
Auth::attempt(['email' => $email, 'password' => $password], $remember) // 継続ログイン
Auth::viaRemember() // remembermeクッキーを使用して認証されている場合true
Auth::login($user) // Userインスタンスによる認証 要Authenticatable契約
Auth::login($user, true) // Userインスタンスによる認証 remembber
Auth::loginUsingId(1)
Auth::loginUsingId(1, true)
Auth::once($credentials)
```
API認証
インストール
bash
composer require laravel/airlock
artisan vendor:publish --provider="Laravel\Airlock\AirlockServiceProvider"
artisan migrate
トークンの発行
```php
class User extends Authenticatable
{
use HasApiTokens;
...
$token = $user->createToken('token-name'); // トークンを発行
return $token->plainTextToken; // 平文を返す
$user->tokens()->delete(); // 全トークンの破棄
$user->tokens()->where('id', $id)->delete(); // 特定トークンの破棄
...
}
```
ルート保護
php
Route::middleware('auth:airlock')->get('/user', function (Request $request) {
return $request->user();
});
php
$response = $client->request('GET', '/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
SPA認証
認可
ゲート
```php
// App\Providers\AuthServiceProvider boot関数内
Gate::define('update-post', function ($user, $post) {
return $user->id == $post->user_id;
});
// コントローラ内でのアクションの認可
Gate::allows('update-post', $post) // 現在のユーザーはこのポストを更新できる場合true
Gate::denies('update-post', $post) // 現在のユーザーはこのポストを更新できない場合true
Gate::forUser($user)->allows('update-post', $post) // 渡されたユーザーはこのポストを更新できる場合true
Gate::forUser($user)->denies('update-post', $post) // 渡されたユーザーはこのポストを更新できない場合true
```
ポリシー作成
bash
artisan make:policy PostPolicy
artisan make:policy PostPolicy --model=Post
ポリシー記述
```php
class PostPolicy
{
public function create(User $user)
{
return $user->role === 'admin';
}
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
```
AuthServiceProvider内でモデルにポリシーを登録
ポリシーフィルター(特定ユーザーには全アクションを許可する)
ポリシー
php
public function before($user, $ability)
{
if ($user->isSuperAdmin()) {
return true;
}
}
アクションの認可
```php
$user->can('update', $post) // 現在のユーザーがポストを更新できる場合true
$user->can('create', Post::class) // モデルを必要としない場合
Route::put('/post/{post}', ...)->middleware('can:update,post'); // ミドルウェアによる認可
Route::put(...)->middleware('can:update,App\Post'); // モデルを必要としないアクション
$this->authorize('update', $post); // コントローラヘルパでの認可
$this->authorize('create', Post::class); // モデルを必要としない場合
html
Bladeテンプレートでの認可
@can('update', $post)
<!-- 現在のユーザーはポストを更新できる -->
@elsecan('create', App\Post::class)
<!-- 現在のユーザーはポストを作成できる -->
@endcan
@cannot('update', $post)
<!-- 現在のユーザーはポストを更新できない -->
@elsecannot('create', App\Post::class)
<!-- 現在のユーザーはポストを作成できない -->
@endcannot
@can('create', App\Post::class)
<!-- 現在のユーザーはポストを更新できる -->
@endcan
@cannot('create', App\Post::class)
<!-- 現在のユーザーはポストを更新できない -->
@endcannot
```
暗号化
artisan key:generate // キー生成
encrypt('secret') // OpenSSLとAES-2560CBCで暗号化
decrypt($encryptedValue) // 復号化
Crypt::encryptString('Hello world.') // シリアライズしないで暗号化
Crypt::decryptString($encrypted) // シリアライズしないで復号化
ハッシュ
Hash::make('password') // ハッシュ化した値を返す
Hash:check('password', $hashedPassword) // 一致したらtrue