0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Nuxt.jsのmiddlewareを使って権限チェックしたらスパゲティになってしまった話

Last updated at Posted at 2022-01-01

はじめに

実装したかった仕様

  • 当初の仕様では、下記の3つの利用権限のみを管理する想定でした。
■利用権限
・ 上級会員権限
・ 中級会員権限
・ 一般メンバー権限
  • しかし、途中で利用権限とは別で役職で権限を分けるオプション権限が仕様追加になりました。これにより、開発後半で、実装が複雑になっていきました…。
■利用権限
・ 上級会員権限
・ 中級会員権限
・ 一般メンバー権限

■役職オプション権限
・ 役員権限
・ 課長権限
・ 部長権限

スクリーンショット 2022-01-01 16.46.41.png

  • 権限パターン表のイメージ
    スクリーンショット 2022-01-01 16.50.22.png

  • 画面上での制御イメージ
    スクリーンショット 2022-01-01 16.51.10.png

実際に実装した内容

権限チェックの全体フロー

  • ログイン時に権限情報を取得して、それをlocalStorageに格納しておき、middlewareで権限チェックするような構成です。

スクリーンショット 2022-01-01 16.52.27.png

実装内容

スクリーンショット 2022-01-01 16.57.38.png

  • 権限に応じた閲覧可能なURL定数をまとめたファイル
permissionConst.js
const permissions = {
  'employee': {
    general: [
    '/admin/organization', 
      '/admin/account'
  ]
  },
  'admin': {
    general: [
      '/admin/organization',
      '/admin/account',
      '/admin/analysis'
    ]
  }
}

  • 認証周りのmiddlewareファイル
auth.js
// URLが企業管理画面の場合
if (fullPath.startsWith('/admin')) {

  if (permissions === 'admin') {
    // ダッシュボードへ
    redirect('/admin');
  }

  // URLが従業員画面の場合
} else if (fullPath.startsWith('/user')) {

  if (permissions === 'admin') {
    // ダッシュボードへ
    redirect('/user');
  }
}
  • 権限制御の画面イメージ
    スクリーンショット 2022-01-01 17.04.29.png

実装してみた中での問題点

  • 追加で新しい権限の概念が出てきた際にさらにif文地獄になる。
  • 新しい権限が増えた時にメニューの表示・非表示の制御が難しくなる。

失敗を通しての改善策

  • バックエンド側で細かい権限の制御ロジックを書く。
  • ビット演算で複数の権限を一意に表現する。
  • メニューの表示・非表示もバックエンド側で判別して、JSONで返却し、フロント側ではそのJSONを元にメニューの出し分けを行う。

スクリーンショット 2022-01-01 17.06.21.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?