前端权限认证—SpringBoot+Vue前后端分离项目

       目前java后端主要用的权限认证框架有SpringSecurity、Apache Shiro、Sa-Token这三种,本文主要讲的是SpringSecurity加上前端的自定义权限指令v-permission的简单创建及使用。

        仅在后端用SpringSecurity时,分配项目角色的权限时可以发现,给角色分配系统的菜单,不勾选菜单之后角色左侧的菜单路由就不会显示,但是取消勾选按钮后,按钮还是会显示在前端页面中,只是在点击后才会提示“无权限”,那如何使权限范围可以控制到页面上的每一个按钮是否显示?如此精确的范围控制只依赖后端已经难以完成,此时需要前端进行一定的逻辑判断,这里具体讲一下前端做法。

一、创建一个permission.js文件,用于判断用户的权限

/**
 * 按钮级权限控制
 */
import { useUserStore } from '@/store/modules/user';

/* 判断数组是否有某些值 */
function arrayHas(array, value) {
  if (!value) {
    return true;
  }
  if (!array) {
    return false;
  }
  if (Array.isArray(value)) {
    for (let i = 0; i < value.length; i++) {
      if (array.indexOf(value[i]) === -1) {
        return false;
      }
    }
    return true;
  }
  return array.indexOf(value) !== -1;
}

/* 判断数组是否有任意值 */
function arrayHasAny(array, value) {
  if (!value) {
    return true;
  }
  if (!array) {
    return false;
  }
  if (Array.isArray(value)) {
    for (let i = 0; i < value.length; i++) {
      if (array.indexOf(value[i]) !== -1) {
        return true;
      }
    }
    return false;
  }
  return array.indexOf(value) !== -1;
}

/**
 * 是否有某些角色
 * @param value 角色字符或字符数组
 */
export function hasRole(value) {
  const userStore = useUserStore();
  return arrayHas(userStore?.roles, value);
}

/**
 * 是否有任意角色
 * @param value 角色字符或字符数组
 */
export function hasAnyRole(value) {
  const userStore = useUserStore();
  return arrayHasAny(userStore?.roles, value);
}

/**
 * 是否有某些权限
 * @param value 权限字符或字符数组
 */
export function hasPermission(value) {
  const userStore = useUserStore();
  return arrayHas(userStore?.authorities, value);
}

/**
 * 是否有任意权限
 * @param value 权限字符或字符数组
 */
export function hasAnyPermission(value) {
  const userStore = useUserStore();
  return arrayHasAny(userStore?.authorities, value);
}

export default {
  install(app) {
    // 添加自定义指令
    app.directive('role', {
      mounted: (el, binding) => {
        if (!hasRole(binding.value)) {
          el.parentNode?.removeChild(el);
        }
      }
    });
    app.directive('any-role', {
      mounted: (el, binding) => {
        if (!hasAnyRole(binding.value)) {
          el.parentNode?.removeChild(el);
        }
      }
    });
    app.directive('permission', {
      mounted: (el, binding) => {
        if (!hasPermission(binding.value)) {
          el.parentNode?.removeChild(el);
        }
      }
    });
    app.directive('any-permission', {
      mounted: (el, binding) => {
        if (!hasAnyPermission(binding.value)) {
          el.parentNode?.removeChild(el);
        }
      }
    });
  }
};

二、然后在main.js中全局引入这个permission.js。(按需引入,可全局,可局部,这种为全局)

import { createApp } from 'vue';
import App from './App.vue';
import store from './store';
import router from './router';
import permission from './utils/permission';
import i18n from './i18n';
import './styles/index.less';

const app = createApp(App);

app.use(store);
app.use(router);
app.use(permission);
app.use(i18n);

app.mount('#app');

三、使用

<a-button type="primary"  class="ele-btn-icon" @click="openAdd()" v-                 
    permission="'sys:caidan:add'">
    <template #icon>
        <plus-outlined />
    </template>
    <span >添加</span>
</a-button>

v-permission里放的时你自定义的按钮权限标识符,此时就能完成权限控制到页面上的每一个按钮是否显示。现在可能会有个疑问,前端有了鉴权后端还需要鉴权吗?

需要!
前端的鉴权只是一个辅助功能,对于专业人员这些限制都是可以轻松绕过的,为保证系统安全:无论前端是否进行了权限校验,后端接口都需要对请求再次进行权限校验!

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring BootVue.js是两个非常流行的技术,可以用于实现前后端分离的歌单应用。 首先,Spring Boot是一个用于快速开发Java应用程序的框架,它提供了一种简化的方式来构建独立的、生产级别的Spring应用程序。它具有自动配置和约定优于配置的特性,可以帮助开发者快速搭建后端服务。 Vue.js是一个用于构建用户界面的渐进式JavaScript框架,它专注于视图层,可以与任何后端技术结合使用。Vue.js具有简单易学、灵活高效的特点,可以帮助开发者构建交互性强、响应式的前端应用。 在前后端分离的歌单应用中,可以将Spring Boot作为后端提供RESTful API接口,处理歌单的增删改查等操作。而Vue.js作为前端框架,负责展示歌单列表、歌曲详情、用户登录等页面。 具体实现步骤如下: 1. 后端开发:使用Spring Boot搭建后端服务,包括定义实体类、编写控制器、服务层和数据访问层等。 2. 前端开发:使用Vue.js创建前端项目,包括设计页面布局、编写组件、处理用户交互等。 3. 前后端通信:通过RESTful API接口实现前后端数据的传输和交互,可以使用Axios等工具库进行网络请求。 4. 数据库操作:使用Spring Data JPA或者MyBatis等框架进行数据库的增删改查操作,存储歌单信息。 5. 用户认证:可以使用Spring Security等安全框架实现用户登录、注册和权限控制等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值