89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
/**
|
|
* 路由守卫模块
|
|
* 提供基于权限的路由拦截和未登录自动跳转登录页功能
|
|
*/
|
|
/**
|
|
* 路由守卫类
|
|
*/
|
|
export class RouterGuard {
|
|
/**
|
|
* 构造函数
|
|
* @param auth 认证实例
|
|
*/
|
|
constructor(auth) {
|
|
this.auth = auth;
|
|
}
|
|
/**
|
|
* 检查路由权限
|
|
* @param options 路由守卫选项
|
|
* @returns Promise<boolean> 是否通过权限检查
|
|
*/
|
|
async check(options) {
|
|
const { requiresAuth = true, requiredPermissions = [] } = options;
|
|
// 检查是否需要登录
|
|
if (requiresAuth) {
|
|
// 检查是否已认证
|
|
if (!this.auth.isAuthenticated()) {
|
|
// 未认证,跳转到登录页
|
|
this.auth.login(options.redirectUri);
|
|
return false;
|
|
}
|
|
// 检查是否需要权限
|
|
if (requiredPermissions.length > 0) {
|
|
// 获取用户权限
|
|
const userPermissions = [''];
|
|
// 检查是否拥有所有需要的权限
|
|
const hasPermission = requiredPermissions.every(permission => userPermissions.includes(permission));
|
|
if (!hasPermission) {
|
|
// 权限不足,跳转到权限不足页
|
|
if (options.unauthorizedRedirectUri) {
|
|
window.location.href = options.unauthorizedRedirectUri;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* 创建Vue路由守卫
|
|
* @returns 路由守卫函数
|
|
*/
|
|
createVueGuard() {
|
|
return async (to, from, next) => {
|
|
var _a;
|
|
// 从路由元信息中获取守卫选项
|
|
const options = ((_a = to.meta) === null || _a === void 0 ? void 0 : _a.auth) || {};
|
|
try {
|
|
const allowed = await this.check(options);
|
|
if (allowed) {
|
|
next();
|
|
}
|
|
}
|
|
catch (error) {
|
|
console.error('Route guard error:', error);
|
|
next(false);
|
|
}
|
|
};
|
|
}
|
|
/**
|
|
* 检查当前用户是否有权限访问资源
|
|
* @param permissions 需要的权限列表
|
|
* @returns Promise<boolean> 是否拥有权限
|
|
*/
|
|
async hasPermission(permissions) {
|
|
if (!permissions) {
|
|
return true;
|
|
}
|
|
const requiredPermissions = Array.isArray(permissions) ? permissions : [permissions];
|
|
// 检查是否已认证
|
|
if (!this.auth.isAuthenticated()) {
|
|
return false;
|
|
}
|
|
// 获取用户权限
|
|
const userPermissions = [''];
|
|
// 检查是否拥有所有需要的权限
|
|
return requiredPermissions.every(permission => userPermissions.includes(permission));
|
|
}
|
|
}
|
|
//# sourceMappingURL=router.js.map
|