企业级前端安全:ant-design-vue-pro中的安全最佳实践与实现

【免费下载链接】ant-design-vue-pro 【免费下载链接】ant-design-vue-pro 项目地址: https://gitcode.com/gh_mirrors/antd/ant-design-vue-pro

在当今数字化时代,企业级应用面临着日益严峻的安全挑战。前端作为用户与系统交互的第一道屏障,其安全性直接关系到整个应用的安全防线。ant-design-vue-pro作为一款优秀的企业级中后台前端解决方案,在设计和实现过程中融入了诸多安全最佳实践,为开发者构建安全可靠的前端应用提供了有力支持。本文将深入探讨ant-design-vue-pro中的安全机制,包括权限控制、请求安全、路由守卫等方面的实现方式和最佳实践,帮助开发者更好地理解和应用这些安全特性,构建更加安全的企业级前端应用。

权限控制:精细化的访问管理

权限控制是企业级应用安全的核心环节之一,它确保用户只能访问其被授权的资源和功能。在ant-design-vue-pro中,权限控制机制被精心设计和实现,提供了灵活而强大的权限管理能力。

权限定义与枚举

ant-design-vue-pro中定义了清晰的权限枚举,涵盖了常见的操作权限,如新增、删除、修改、查询等。这些权限枚举在src/core/permission/permission.js文件中进行了定义,代码如下:

export const PERMISSION_ENUM = {
  'add': { key: 'add', label: '新增' },
  'delete': { key: 'delete', label: '删除' },
  'edit': { key: 'edit', label: '修改' },
  'query': { key: 'query', label: '查询' },
  'get': { key: 'get', label: '详情' },
  'enable': { key: 'enable', label: '启用' },
  'disable': { key: 'disable', label: '禁用' },
  'import': { key: 'import', label: '导入' },
  'export': { key: 'export', label: '导出' }
}

这些枚举值为权限的统一管理和使用提供了基础,使得开发者可以在应用中方便地引用和判断各种权限。

权限判断与指令

为了在视图层方便地进行权限控制,ant-design-vue-pro在Vue原型上挂载了$auth方法,用于判断用户是否拥有某项权限。同时,还提供了权限指令,使得开发者可以在模板中通过简单的方式控制元素的显示与隐藏。

$auth方法的实现代码如下(位于src/core/permission/permission.js):

!Vue.prototype.$auth && Object.defineProperties(Vue.prototype, {
  $auth: {
    get () {
      const _this = this
      return (permissions) => {
        const [permission, action] = permissions.split('.')
        const permissionList = _this.$store.getters.roles.permissions
        return permissionList.find((val) => {
          return val.permissionId === permission
        }).actionList.findIndex((val) => {
          return val === action
        }) > -1
      }
    }
  }
})

在模板中使用$auth方法的示例如下:

<a-button v-if="$auth('form.edit')">编辑</a-button>

这种方式使得权限控制与视图渲染紧密结合,提高了开发效率和代码的可读性。

请求安全:保障数据传输的安全性

在前端应用中,与后端的交互是不可避免的。为了保障数据传输的安全性,ant-design-vue-pro在请求处理方面采取了一系列安全措施。

请求拦截与Token认证

ant-design-vue-pro使用axios作为HTTP请求库,并通过请求拦截器实现了Token的自动携带。在src/utils/request.js文件中,我们可以看到相关的实现代码:

// request interceptor
request.interceptors.request.use(config => {
  const token = storage.get(ACCESS_TOKEN)
  // 如果 token 存在
  // 让每个请求携带自定义 token 请根据实际情况自行修改
  if (token) {
    config.headers[ACCESS_TOKEN] = token
  }
  return config
}, errorHandler)

这段代码的作用是在每个请求发送之前,检查本地存储中是否存在访问令牌(ACCESS_TOKEN)。如果存在,则将其添加到请求头中,以便后端进行身份验证。这种方式可以有效防止未授权的请求访问受保护的资源。

响应拦截与错误处理

除了请求拦截器,ant-design-vue-pro还实现了响应拦截器,用于统一处理后端返回的响应和错误。在src/utils/request.js文件中,响应拦截器的代码如下:

// response interceptor
request.interceptors.response.use((response) => {
  return response.data
}, errorHandler)

其中,errorHandler函数用于处理请求错误,包括401(未授权)和403(禁止访问)等常见的HTTP错误状态码。例如,当后端返回401错误时,前端会自动清除本地存储中的Token,并跳转到登录页面,代码如下:

if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
  notification.error({
    message: 'Unauthorized',
    description: 'Authorization verification failed'
  })
  if (token) {
    store.dispatch('Logout').then(() => {
      setTimeout(() => {
        window.location.reload()
      }, 1500)
    })
  }
}

这种统一的错误处理机制可以提高应用的健壮性和安全性,确保在出现异常情况时能够及时采取相应的措施。

路由守卫:控制页面访问权限

路由守卫是前端路由系统中的重要组成部分,它可以在路由切换过程中进行权限检查和控制,防止未授权的用户访问受保护的页面。

全局前置守卫

ant-design-vue-pro在src/permission.js文件中实现了全局前置守卫,用于对所有路由进行权限检查。核心代码如下:

router.beforeEach((to, from, next) => {
  NProgress.start() // start progress bar
  to.meta && typeof to.meta.title !== 'undefined' && setDocumentTitle(`${i18nRender(to.meta.title)} - ${domTitle}`)
  /* has token */
  const token = storage.get(ACCESS_TOKEN)
  if (token) {
    if (to.path === loginRoutePath) {
      next({ path: defaultRoutePath })
      NProgress.done()
    } else {
      // check login user.roles is null
      if (store.getters.roles.length === 0) {
        // request login userInfo
        store
          .dispatch('GetInfo')
          .then(res => {
            // 根据用户权限信息生成可访问的路由表
            store.dispatch('GenerateRoutes', { token, ...res }).then(() => {
              // 动态添加可访问路由表
              resetRouter() 
              store.getters.addRouters.forEach(r => {
                router.addRoute(r)
              })
              // 请求带有 redirect 重定向时,登录自动重定向到该地址
              const redirect = decodeURIComponent(from.query.redirect || to.path)
              if (to.path === redirect) {
                next({ ...to, replace: true })
              } else {
                next({ path: redirect })
              }
            })
          })
          .catch(() => {
            notification.error({
              message: '错误',
              description: '请求用户信息失败,请重试'
            })
            // 失败时,获取用户信息失败时,调用登出,来清空历史保留信息
            store.dispatch('Logout').then(() => {
              next({ path: loginRoutePath, query: { redirect: to.fullPath } })
            })
          })
      } else {
        next()
      }
    }
  } else {
    if (allowList.includes(to.name)) {
      // 在免登录名单,直接进入
      next()
    } else {
      next({ path: loginRoutePath, query: { redirect: to.fullPath } })
      NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
    }
  }
})

这段代码实现了以下功能:

  1. 检查用户是否已登录(即是否存在Token)。
  2. 如果已登录,且访问的是登录页面,则自动跳转到默认首页。
  3. 如果已登录,但用户角色信息尚未加载,则请求用户信息,并根据用户权限动态生成可访问的路由表。
  4. 如果未登录,则检查当前路由是否在免登录名单中。如果不在,则跳转到登录页面,并携带当前路由作为重定向参数。

通过这些措施,ant-design-vue-pro有效地控制了页面的访问权限,防止了未授权用户访问受保护的资源。

路由动态生成:基于权限的路由管理

为了实现基于用户权限的动态路由,ant-design-vue-pro在src/permission.js文件中还实现了路由的动态生成功能。当用户登录并获取到角色信息后,系统会根据用户的权限动态生成可访问的路由表,并通过router.addRoute方法将其添加到路由系统中。

相关的代码如下:

store.dispatch('GenerateRoutes', { token, ...res }).then(() => {
  // 动态添加可访问路由表
  // VueRouter@3.5.0+ New API
  resetRouter() // 重置路由 防止退出重新登录或者 token 过期后页面未刷新,导致的路由重复添加
  store.getters.addRouters.forEach(r => {
    router.addRoute(r)
  })
  // 请求带有 redirect 重定向时,登录自动重定向到该地址
  const redirect = decodeURIComponent(from.query.redirect || to.path)
  if (to.path === redirect) {
    // set the replace: true so the navigation will not leave a history record
    next({ ...to, replace: true })
  } else {
    // 跳转到目的路由
    next({ path: redirect })
  }
})

这种动态路由生成的方式使得不同权限的用户看到的路由菜单不同,从而实现了精细化的权限控制。

总结与展望

ant-design-vue-pro作为一款成熟的企业级前端解决方案,在安全方面提供了全面而实用的最佳实践。通过精细化的权限控制、安全的请求处理、严格的路由守卫和动态的路由生成等机制,有效地保障了前端应用的安全性。

然而,安全是一个持续的过程,随着技术的发展和安全威胁的演变,前端安全防护也需要不断地更新和完善。未来,我们可以期待ant-design-vue-pro在以下方面进一步加强安全措施:

  1. 引入更先进的前端安全技术,如内容安全策略(CSP)等。
  2. 加强对XSS和CSRF等常见安全漏洞的防护。
  3. 提供更加丰富和灵活的权限管理功能,以满足复杂企业应用的需求。

总之,ant-design-vue-pro为我们构建安全可靠的企业级前端应用提供了坚实的基础。开发者在使用该框架时,应当充分利用其提供的安全特性,并结合实际项目需求,进一步加强应用的安全防护能力。

【免费下载链接】ant-design-vue-pro 【免费下载链接】ant-design-vue-pro 项目地址: https://gitcode.com/gh_mirrors/antd/ant-design-vue-pro

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐