Вкратце - это обёртка над router.push/replace(), изначально созданная исключительно в качестве сахара (да, чтобы не писать useRouter()), потом её научили выполнять редирект на стороне сервера, а потом научили справляться с внешними урлами.
все используют router.push
Это появилось только в Nuxt 3, который всё ещё не то чтобы production-ready, поэтому не успело примелькаться.
сущности в алфавитном порядке в ед.числе в snake_case, например, blog_category_post или product_shop_category
поля в pivot: blog_category_id и post_id, shop_category_id и product_id
На бэкенде однозначно нужно проверять права на каждое действие. Готовых решений для RBAC в Laravel множество, все сходятся к примерно одинаковой схеме: есть роли, у каждой есть права, каждый юзер относится к какой-то роли/ролям.
Во фронтенде - просто грузить с сервера список прав, которые есть у пользователя, сохранять это во vuex. Написать простой геттер (can, например), проверяющий, есть ли в этом списке конкретное право. И потом что-то вроде v-if="can('some-permission')"
Я бы так сделал