Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Laravel7.0-セキュリティ-

(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); // モデルを必要としない場合

Bladeテンプレートでの認可
html
@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
hiroita
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away