Hone logo
Hone
Problems

Secure Route Access with Vue Navigation Guards

Navigation guards in Vue.js provide a powerful mechanism to control access to routes based on various conditions, such as user authentication status or specific roles. This challenge asks you to implement navigation guards to restrict access to certain routes within a Vue application, ensuring a secure and controlled user experience. This is a crucial aspect of building robust and secure web applications.

Problem Description

You are tasked with implementing navigation guards in a Vue.js application to protect specific routes. The application has a /admin route that should only be accessible to authenticated users with the role "admin". The application also has a /profile route that should only be accessible to authenticated users, regardless of their role. Unauthenticated users attempting to access either of these routes should be redirected to a /login route.

What needs to be achieved:

  • Implement beforeEach and beforeEnter navigation guards (choose the appropriate one based on Vue Router version - see Notes).
  • Define a isAuthenticated function that checks if a user is currently logged in (simulated with a simple boolean flag for this challenge).
  • Define a hasRole function that checks if a user has a specific role (simulated with a simple role string for this challenge).
  • Redirect unauthenticated users to the /login route.
  • Redirect unauthorized users (non-admins) attempting to access /admin to the /login route.
  • Allow authenticated users (regardless of role) to access /profile.

Key Requirements:

  • The navigation guards should be implemented globally within your Vue application.
  • The isAuthenticated and hasRole functions should be clearly defined and reusable.
  • The redirection to /login should be seamless and prevent the user from accessing the protected route.
  • The code should be well-structured and easy to understand.

Expected Behavior:

  • If a user is authenticated and has the "admin" role, they can access /admin.
  • If a user is authenticated but does not have the "admin" role, they are redirected to /login when attempting to access /admin.
  • If a user is authenticated (regardless of role), they can access /profile.
  • If a user is not authenticated, they are redirected to /login when attempting to access /admin or /profile.

Edge Cases to Consider:

  • What happens if the user is already on the /admin or /profile route when they log out? (Consider redirecting them to /login in this scenario).
  • How should the application handle potential errors during authentication checks? (For simplicity, assume authentication checks always succeed in this challenge).

Examples

Example 1:

Input: User is authenticated, has role "admin", attempts to access /admin
Output: User is allowed to access /admin.
Explanation: The user meets both authentication and role requirements.

Example 2:

Input: User is authenticated, has role "user", attempts to access /admin
Output: User is redirected to /login.
Explanation: The user is authenticated but lacks the required "admin" role.

Example 3:

Input: User is not authenticated, attempts to access /profile
Output: User is redirected to /login.
Explanation: The user is not authenticated and therefore cannot access the protected route.

Constraints

  • The solution must be implemented using TypeScript.
  • The Vue Router version is assumed to be Vue Router 4. If using an older version, adjust the guard implementation accordingly (using router.addRoutes for global guards).
  • The isAuthenticated and hasRole functions are simplified for this challenge and do not involve actual authentication logic. Assume they return the correct boolean values based on the current application state.
  • The application state (authentication status and user role) is managed outside the scope of this challenge.

Notes

  • Vue Router Version: Vue Router 4 uses beforeEnter guards for single-page application components. Vue Router 3 used beforeEach for global guards. Choose the appropriate guard based on your Vue Router version. The problem description assumes Vue Router 4.
  • isAuthenticated and hasRole: These functions are placeholders. In a real application, they would interact with your authentication system to determine the user's status and role.
  • State Management: This challenge focuses solely on the navigation guard implementation. The authentication state (whether a user is logged in and their role) is assumed to be managed elsewhere (e.g., using Vuex or Pinia).
  • Error Handling: For simplicity, error handling during authentication checks is omitted. In a production environment, you should handle potential errors gracefully.
  • Redirection: Use router.push('/login') or router.replace('/login') to redirect the user. router.replace prevents the user from navigating back to the protected route using the browser's back button. Consider which is more appropriate for your application's UX.
Loading editor...
typescript