Vue.jsでのロールベースのアクセスポリシーを作成するセキュリティガイド

Vue.jsでのロールベースのアクセスポリシーを作成するセキュリティガイド

Vue.jsアプリケーションにおけるロールベースのアクセスポリシー(RBAC)を実装することで、不正アクセスを防ぎ、ユーザーごとに適切な権限を割り当てることが可能になります。この記事では、Vue.jsで効果的にRBACを構築し、安全性を高める方法を解説します。

ロールベースのアクセスポリシー(RBAC)とは

RBACは、ユーザーの役割(ロール)に応じてアクセス権を制御する方法です。

  • 管理者
  • 編集者
  • 閲覧者

Vue.jsプロジェクトのセットアップ

新しいVue.jsプロジェクトを作成し、必要なライブラリをインストールします。

npm install vue-router vuex

ユーザーロールの定義

ユーザーロールを定義し、役割ごとの権限を管理します。

// roles.js
export const roles = {
  ADMIN: 'admin',
  EDITOR: 'editor',
  VIEWER: 'viewer'
};

Vuexストアでユーザー情報を管理

Vuexストアを使ってユーザー情報とロールを管理します。

// store.js
export default {
  state: {
    user: {
      name: 'John Doe',
      role: 'admin'
    }
  },
  getters: {
    userRole: state => state.user.role
  }
};

ルーターガードを設定

Vue Routerを使ってアクセス制御を設定します。

// router/index.js
import store from '@/store';

const router = new VueRouter({
  routes: [
    { path: '/admin', component: AdminPage, meta: { role: 'admin' } },
    { path: '/editor', component: EditorPage, meta: { role: 'editor' } }
  ]
});

router.beforeEach((to, from, next) => {
  const userRole = store.getters.userRole;
  if (to.meta.role && to.meta.role !== userRole) {
    next('/unauthorized');
  } else {
    next();
  }
});

権限別コンポーネントの表示

特定の役割にのみコンポーネントを表示させます。

<template>
  <div v-if="userRole === 'admin'">
    管理者用ダッシュボード
  </div>
</template>

<script>
import { mapGetters } from 'vuex';
export default {
  computed: {
    ...mapGetters(['userRole'])
  }
};
</script>

Unauthorizedページの作成

権限のないユーザーがアクセスした場合に表示するページを作成します。

<template>
  <div>
    アクセス権がありません
  </div>
</template>

バックエンドとの連携

バックエンドAPIからユーザー情報を取得し、ロールを動的に設定します。

methods: {
  async fetchUser() {
    const response = await fetch('/api/user');
    const data = await response.json();
    this.$store.commit('setUser', data);
  }
}

カスタムディレクティブで制御

カスタムディレクティブを作成し、特定の要素を表示制御します。

Vue.directive('role', {
  bind(el, binding, vnode) {
    const userRole = store.getters.userRole;
    if (binding.value !== userRole) {
      el.style.display = 'none';
    }
  }
});

動的メニューの生成

ユーザーの役割に応じて動的にメニューを生成します。

<template>
  <ul>
    <li v-if="userRole === 'admin'">管理者メニュー</li>
    <li v-if="userRole === 'editor'">編集者メニュー</li>
  </ul>
</template>

トークンベース認証との統合

JWTトークンを使用して、ユーザーのロールをバックエンドから取得します。

methods: {
  async login() {
    const response = await fetch('/api/login');
    const data = await response.json();
    localStorage.setItem('token', data.token);
    this.$store.commit('setUser', data.user);
  }
}

エラーハンドリング

不正アクセス時のエラーハンドリングを実装します。

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !store.state.user) {
    next('/login');
  } else {
    next();
  }
});

パフォーマンスの最適化

RBACのパフォーマンスを最適化し、不要なチェックを避けます。

まとめ

Vue.jsでロールベースのアクセスポリシーを構築することで、ユーザーごとに安全かつ柔軟なアクセス制御が可能になります。Vue RouterやVuexを活用して、信頼性の高いシステムを構築しましょう。