> 웹 프론트엔드 > 프런트엔드 Q&A > Vue가 라우팅 권한 제어를 구현하는 방법에 대한 자세한 설명

Vue가 라우팅 권한 제어를 구현하는 방법에 대한 자세한 설명

PHPz
풀어 주다: 2023-04-12 10:00:45
원래의
6274명이 탐색했습니다.

Vue는 요즘 매우 인기 있는 프런트 엔드 프레임워크 중 하나입니다. 전통적인 페이지 렌더링 방법에 비해 Vue는 프런트 엔드 라우팅 관리에 더 많은 관심을 기울입니다. 실제 프로젝트에서는 프런트 엔드 라우팅의 액세스 권한도 매우 중요한 문제입니다. 그렇다면 Vue에서 라우팅 권한 제어를 구현하는 방법은 무엇입니까?

Vue에는 라우팅 권한 제어를 구현하는 두 가지 주요 방법이 있습니다. 하나는 프런트 엔드에서 제어하는 ​​것입니다. 즉, 다양한 사용자 권한에 따라 라우팅 테이블을 동적으로 생성하는 것이고, 다른 하나는 백엔드 인터페이스를 통해 제어하는 ​​것입니다. 즉, 프런트 엔드는 백엔드로 요청을 시작하고 반환된 권한 정보를 기반으로 해당 라우팅 테이블을 생성합니다.

  1. 프런트엔드 제어 방법

프론트엔드 제어 방법에서는 다음 단계를 통해 라우팅 권한 제어를 구현할 수 있습니다.

1.1 라우팅 구성 파일에서 구성

Vue에서는 일반적으로 를 사용합니다. >router 폴더 하위의 index.js 파일에는 다양한 라우팅 정보가 구성됩니다. 라우팅 권한 제어를 수행할 때 라우팅 권한 정보를 저장하기 위해 이 파일에 라우팅의 meta 정보를 구성할 수 있습니다. router文件夹下创建一个index.js文件,文件中会配置各种路由信息。在进行路由权限控制时,我们可以在这个文件中配置路由的meta信息,用于存储路由的权限信息。

比如,我们可以这样定义一个需要根据用户权限来控制访问的路由:

{
  path: '/admin',
  name: 'admin',
  component: () => import('@/views/Admin.vue'),
  meta: { requiresAuth: true }
},
로그인 후 복사

在这个路由配置中,我们定义了一个名为requiresAuthmeta属性,用于标记这是一个需要控制权限的路由。

1.2 在路由拦截器中进行控制

拦截器实际上就是一段代码,用于在某些特定的情况下,拦截请求并执行指定的操作。在Vue中,我们可以使用beforeEach方法来拦截路由请求,进行权限控制。

比如,我们可以这样定义一个beforeEach方法:

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!store.getters.isLoggedIn) {
      next({ path: '/login' });
    } else {
      next();
    }
  } else {
    next();
  }
});
로그인 후 복사

在这个拦截器中,我们通过判断当前需要访问的路由与之前定义的meta属性来判断是否需要进行权限控制。如果需要,我们再根据用户的登录状态等信息进行访问控制,并在必要时跳转到指定的页面。

  1. 后端控制方法

在后端控制方法中,我们需要通过向后端发送请求,获取返回的用户权限信息,然后在生成路由表时进行相应的控制。

比如,在一个基于JWT的后端返回/admin这个路由需要管理员权限才能访问,我们可以这样来获取用户的权限信息:

const response = await axios.get('/user');
const permissions = response.data.permissions;
로그인 후 복사

在获取到用户的权限信息后,我们可以利用Vue Router的动态路由生成等功能,来动态地生成路由表。

比如,我们可以这样定义一个动态生成路由表的函数:

function generateRoutesFromMenu (menu = [], permissions = {}) {
  const routes = []

  for (let i = 0, l = menu.length; i < l; i++) {
    const item = menu[i]
    const route = {
      path: item.path,
      name: item.name,
      meta: item.meta, // 从菜单项中提取出路由的meta信息
      component: item.component ? loadView(item.component) : null,
      children: item.children ? generateRoutesFromMenu(item.children, permissions) : []
    }

    // 如果路由需要控制权限
    if (route.meta && route.meta.requiresAuth) {
      // 判断用户是否有权限访问该路由
      if (permissions[route.meta.permissionKey]) {
        // 用户有权限,则把该路由加入到路由表中
        routes.push(route)
      }
    } else {
      // 如果不需要权限控制,则直接加入到路由表中
      routes.push(route)
    }
  }

  return routes
}
로그인 후 복사

在这个函数中,我们可以看到,我们通过定义菜单项中的meta

예를 들어 다음과 같이 사용자 권한에 따라 액세스를 제어해야 하는 경로를 정의할 수 있습니다.

rrreee

이 라우팅 구성에서는 requiresAuth라는 메타를 정의합니다. >제어 권한이 필요한 경로로 표시하는 데 사용되는 속성입니다. 🎜🎜1.2 경로 인터셉터의 제어🎜🎜인셉터는 실제로 특정 상황에서 요청을 가로채고 지정된 작업을 수행하는 데 사용되는 코드 조각입니다. Vue에서는 beforeEach 메서드를 사용하여 라우팅 요청을 가로채고 권한 제어를 수행할 수 있습니다. 🎜🎜예를 들어, 다음과 같이 beforeEach 메소드를 정의할 수 있습니다: 🎜rrreee🎜이 인터셉터에서는 현재 액세스해야 하는 경로와 이전에 정의된 메타를 결정합니다. 속성에서 권한 제어가 필요한지 여부를 결정합니다. 필요한 경우, 사용자의 로그인 상태 및 기타 정보를 기반으로 접근 제어를 수행하고, 필요한 경우 지정된 페이지로 이동합니다. 🎜
    🎜백엔드 제어 방법🎜🎜🎜백엔드 제어 방법에서는 백엔드에 요청을 보내 반환된 사용자 권한 정보를 얻은 후 라우팅 테이블 생성 시 해당 제어를 수행해야 합니다. 🎜🎜예를 들어 JWT 기반 백엔드가 /admin을 반환하는 경우 이 경로에 액세스하려면 관리자 권한이 필요합니다. 🎜rrreee🎜사용자 권한 정보를 얻은 후 마지막으로 , Vue Router의 동적 경로 생성 및 기타 기능을 사용하여 라우팅 테이블을 동적으로 생성할 수 있습니다. 🎜🎜예를 들어 다음과 같이 라우팅 테이블을 동적으로 생성하는 함수를 정의할 수 있습니다. 🎜rrreee🎜이 함수에서는 meta 속성을 ​​정의하여 표시해야 하는 경로를 표시하는 것을 볼 수 있습니다. 메뉴 항목에서 권한 제어를 수행합니다. 라우팅 테이블을 생성할 때 사용자의 권한 정보를 기반으로 이러한 경로를 라우팅 테이블에 추가해야 하는지 여부를 결정합니다. 권한 제어가 필요하지 않은 경우 라우팅 테이블에 직접 추가할 수 있습니다. 🎜🎜요약하자면, Vue에서 라우팅 권한 제어를 구현하는 두 가지 주요 방법이 있습니다. 하나는 프런트 엔드에서 이를 제어하는 ​​것입니다. 즉, 다른 사용자 권한에 따라 라우팅 테이블을 동적으로 생성하는 것입니다. 백엔드 인터페이스 제어, 즉 프런트엔드는 백엔드에 대한 요청을 시작하고 반환된 권한 정보를 기반으로 해당 라우팅 테이블을 생성합니다. 실제 개발에서는 특정 프로젝트 조건에 따라 라우팅 권한 제어를 구현하는 적절한 방법을 선택할 수 있습니다. 🎜

위 내용은 Vue가 라우팅 권한 제어를 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿