Skip to content

uniapp-权限拦截

正常我们的项目都会有权限控制,比如登录权限才能访问的页面

接下来我们就尝试一下这一部分

1、存储用户token

登录以后我们拿到token保存到本地,后面的登录用户信息和相关接口也是利用我们的token来进行

  • 登录以后我们存储一下token,后面的接口请求都需要用到token,我们定义为token
JS
uni.setStorageSync('token',res.token);

2、封装权限检查

☞ 在src => utils 目录中创建一个 auth.js 文件,封装判断用户是否已登录的逻辑:

JS
/**
 * 判断用户是否登录
 * @returns {boolean} 返回登录状态
 */
export const checkLogin = () => {
  const token = uni.getStorageSync('user_token');
  if (token) {
    return true; // 已登录
  }
  return false; // 未登录
};

/**
 * 登录检查,未登录时弹出提示并跳转到登录页面
 * @param {Function} callback 如果已登录,执行 callback
 */
export const checkLoginAndRedirect = (callback) => {
  const isLoggedIn = checkLogin();
  if (isLoggedIn) {
    // 如果已登录,执行回调
    if (callback) callback();
  } else {
    // 如果未登录,弹出提示并跳转到登录页面
    uni.showModal({
      title: '提示',
      content: '您还未登录,请先登录!',
      success: (res) => {
        if (res.confirm) {
          // 用户点击了"确定",跳转到登录页面
          uni.navigateTo({
            url: '/pages/login/login' // 根据你的项目调整登录页面路径
          });
        }
      }
    });
  }
};

3、使用权限检查

  • 在登录的首页之中引入和检查用户登录状态
JS

import {ref,onMounted} from "vue";

import { checkLoginAndRedirect } from '@/utils/auth.js';

onMounted(() => {
    checkLoginAndRedirect((res) => {
        console.log('核查登录状态结束!');
    });
});

4、获取登录人信息

在登录成功以后,我们利用token拿到登录人的用户ID

☞ 这部分也是放到我们的验证权限里面

JS
if (isLoggedIn) {
	  console.log('用户已登录!');
	  // uni.getStorageSync('token');
	  request({
	  	url: '/getInfo', // 这里的 url 会自动加上 /api 前缀
	  	method: 'GET',
	  }).then((res) => {
	  	console.log('🚀 → res -> 请求成功:', res);
	  	if (res.code == 200) {
			uni.setStorageSync('userId', res.user.id);
			uni.showToast({
				title: res.message,
				duration: 2000
			});
	  	} else{
	  		uni.showModal({
	  			title: '提示',
	  			content: res.message,
	  			success: function(res) {
	  				if (res.confirm) {
						uni.removeStorageSync('userId');
						uni.showToast({
							title: res.message,
							duration: 2000
						});
						uni.reLaunch({
							url:'/pages/component/login/login'
						})
	  				} else if (res.cancel) {}
	  			}
	  		});
	  	}
	  }).catch((error) => {
	  	console.log('请求失败:', error);
	  });
    // 如果已登录,执行回调
    if (callback) callback();
  }

通过上面接口,我们就可以正确拿到用户的userId,然后存储到本地

本地直接调用我们拿到的Token信息

JS
uni.getStorageSync('token')

5、千人千页

接下来我们就需要根据用户不同的权限去跳转不同的页面,达到每个人进来以后根据自己的权限看到不同的页面

👉 从接口之中获取我们权限

JS
// 获取用户信息
const userInfo = uni.getStorageSync('userInfo');
// 获取用户权限
const userPermissions = userInfo.permissions;
// 根据用户权限跳转到不同的页面
if (userPermissions.includes('admin')) {
	uni.navigateTo({
		url: '/pages/admin/admin'
	});
} else if (userPermissions.includes('user')) {	
	uni.navigateTo({
		url: '/pages/user/user'
	});
} else {
	uni.navigateTo({
		url: '/pages/visitor/visitor'
	});
}

👉从本地缓存中获取用户权限

JS
// 假设用户权限存储在本地缓存中
const userPermissions = uni.getStorageSync('userPermissions'); // 获取用户权限数据

// 判断用户权限并跳转到不同的页面
if (userPermissions.includes('admin')) {
    // 如果用户有 admin 权限,跳转到 admin 页面
    uni.navigateTo({
        url: '/pages/admin/admin' // 跳转到管理员页面
    });
} else if (userPermissions.includes('editor')) {
    // 如果用户有 editor 权限,跳转到 editor 页面
    uni.navigateTo({
        url: '/pages/editor/editor' // 跳转到编辑页面
    });
} else {
    // 如果用户没有 admin 或 editor 权限,跳转到默认页面
    uni.navigateTo({
        url: '/pages/default/default' // 跳转到默认页面
    });
}

👉封装简化权限判断和跳转

封装权限为函数可以封装为:

JS
function checkPermissionsAndRedirect() {
    const userPermissions = uni.getStorageSync('userPermissions'); // 获取用户权限数据
    // 根据权限判断并跳转到不同页面
    if (userPermissions.includes('admin')) {
        uni.navigateTo({
            url: '/pages/admin/admin' // 跳转到管理员页面
        });
    } else if (userPermissions.includes('editor')) {
        uni.navigateTo({
            url: '/pages/editor/editor' // 跳转到编辑页面
        });
    } else {
        uni.navigateTo({
            url: '/pages/default/default' // 跳转到默认页面
        });
    }
}

// 在页面加载时调用权限检查和跳转函数
onLoad() {
    checkPermissionsAndRedirect(); // 调用权限检查并跳转
}

👉 权限更新

用户登录以后,用户的权限中途进行了更新,这就需要重新进行权限检查和跳转。我们采取的的方式是,登录缓存权限,页面检查权限,权限更新后,重新登录,更新缓存权限。

JS
// 假设用户登录后返回的权限信息
const newPermissions = ['admin', 'editor']; // 这是从 API 获取到的权限

// 保存到本地缓存
uni.setStorageSync('userPermissions', newPermissions);

// 根据新的权限跳转页面
checkPermissionsAndRedirect();

👉权限不足拦截提示 用户权限不够的时候给个提示,跳转到权限不足页面

JS
if (!userPermissions.includes('admin')) {
    uni.showToast({
        title: '权限不足',
        icon: 'none'
    });
    uni.navigateTo({
        url: '/pages/no-permission/no-permission' // 跳转到权限不足页面
    });
}

Released under the MIT License.