first pass of RBAC systems

This commit is contained in:
2025-10-19 23:57:14 -04:00
parent 06764ebeb4
commit 3cc5d0a981
3 changed files with 25 additions and 25 deletions

View File

@@ -10,10 +10,6 @@
<Button variant="default" @click="goHome"> <Button variant="default" @click="goHome">
Go to Home Go to Home
</Button> </Button>
<Button variant="outline" @click="loginIfNeeded">
Log In
</Button>
</div> </div>
</div> </div>
</template> </template>
@@ -21,7 +17,7 @@
<script setup lang="ts"> <script setup lang="ts">
import Button from '@/components/ui/button/Button.vue' import Button from '@/components/ui/button/Button.vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { useUserStore } from '@/stores/user' // adjust path to your store import { useUserStore } from '@/stores/user'
const router = useRouter() const router = useRouter()
const user = useUserStore() const user = useUserStore()
@@ -29,12 +25,4 @@ const user = useUserStore()
function goHome() { function goHome() {
router.push('/') router.push('/')
} }
function loginIfNeeded() {
if (!user.isLoggedIn) {
window.location.href = 'https://your-auth-service/login'
} else {
router.push('/')
}
}
</script> </script>

View File

@@ -37,16 +37,16 @@ const router = createRouter({
}) })
router.beforeEach(async (to) => { router.beforeEach(async (to) => {
const userStore = useUserStore() const user = useUserStore()
// Make sure user state is loaded before checking // Make sure user state is loaded before checking
if (!userStore.loaded) { if (!user.loaded) {
console.log('loaduser') console.log('loaduser')
await userStore.loadUser(); await user.loadUser();
} }
// Not logged in // Not logged in
if (to.meta.requiresAuth && !userStore.isLoggedIn) { if (to.meta.requiresAuth && !user.isLoggedIn) {
// Redirect back to original page after login // Redirect back to original page after login
const redirectUrl = encodeURIComponent(window.location.origin + to.fullPath) const redirectUrl = encodeURIComponent(window.location.origin + to.fullPath)
window.location.href = `https://aj17thdevapi.nexuszone.net/login?redirect=${redirectUrl}` window.location.href = `https://aj17thdevapi.nexuszone.net/login?redirect=${redirectUrl}`
@@ -55,14 +55,16 @@ router.beforeEach(async (to) => {
// Must be a member // Must be a member
if (to.meta.memberOnly && userStore.state !== 'member') { if (to.meta.memberOnly && user.state !== 'member') {
return '/unauthorized' return '/unauthorized'
} }
// // Must have specific role console.log(!user.hasRole("Dev"));
// if (to.meta.roles && !to.meta.roles.includes(userStore.role)) {
// return '/unauthorized' // Must have specific role
// } if (to.meta.roles && !user.hasRole('Dev') && !user.hasAnyRole(to.meta.roles)) {
return '/unauthorized'
}
}) })
export default router; export default router;

View File

@@ -3,9 +3,9 @@ import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', () => { export const useUserStore = defineStore('user', () => {
const user = ref(null) const user = ref(null)
const roles = computed(() => { user.value.roles }) const roles = computed(() => new Set(user.value?.roleData?.map(r => r.name) ?? []));
const loaded = ref(false); const loaded = ref(false);
const state = computed(() => user.value.state);
const isLoggedIn = computed(() => user.value !== null) const isLoggedIn = computed(() => user.value !== null)
async function loadUser() { async function loadUser() {
@@ -23,5 +23,15 @@ export const useUserStore = defineStore('user', () => {
loaded.value = true; loaded.value = true;
} }
return { user, isLoggedIn, roles, loadUser, loaded }
function hasRole(role: string): boolean {
return roles.value.has(role)
}
function hasAnyRole(requiredRoles: string[]): boolean {
return requiredRoles.some(r => roles.value.has(r))
}
return { user, isLoggedIn, roles, loadUser, loaded, hasAnyRole, hasRole, state }
}) })