Recipes

Protected Dashboard

Protect a dashboard page with definePageMeta and role checks.

Goal

Protect a page with zero custom middleware and layer permissions on top.

Page Guard (Auth)

app/pages/admin/dashboard.vue
<script setup lang="ts">
definePageMeta({
  convexAuth: true,
})

const { user } = useConvexAuth()
</script>

<template>
  <div>
    <h1>Admin Dashboard</h1>
    <p>Signed in as {{ user?.email || user?.name }}</p>
  </div>
</template>

Add Permission Checks

app/pages/admin/dashboard.vue
<script setup lang="ts">
definePageMeta({ convexAuth: true })

const { can, pending } = usePermissions()
const canViewAdmin = can('admin.view')
</script>

<template>
  <div v-if="pending">Loading permissions...</div>
  <div v-else-if="canViewAdmin">
    <h1>Admin Dashboard</h1>
  </div>
  <div v-else>
    <p>You do not have access.</p>
  </div>
</template>

Optional Per-Page Redirect

definePageMeta({
  convexAuth: { redirectTo: '/login' },
})