@jianghujs/jianghu
Version:
Progressive Enterprise Framework
86 lines (74 loc) • 2.74 kB
JavaScript
;
const { userStatusObj } = require('../constant/constant');
const { errorInfoEnum } = require('../constant/error');
module.exports = option => {
return async (ctx, next) => {
const { packagePage, userInfo } = ctx;
const { user, userAppList, allowPageList } = userInfo;
const { pageId } = packagePage;
const { config } = ctx.app;
const { appType, appId } = config;
const isLoginUser = user && user.userId;
const goToErrorPage = ({ error }) => {
const { errorCode, errorReason } = error;
ctx.redirect(
`${ctx.app.config.helpPage}?errorCode=${errorCode}&errorReason=${errorReason}`
);
};
const goToErrorLoginPage = ({ error }) => {
const { errorCode, errorReason } = error;
ctx.redirect(
`${ctx.app.config.loginPage}?errorCode=${errorCode}&errorReason=${errorReason}`
);
};
// 对于 public page ====》不需要做 用户状态的校验
// public: { user: "*", group: "public", role: "*" }
const isPublic = allowPageList.find(page => page.pageId === pageId)?.isPublic || false;
if (isPublic) {
// 5. 已登录 从登录页自动则重定向到首页
if (pageId === 'login' && isLoginUser && !ctx.request.query.errorCode) {
ctx.redirect(ctx.app.config.indexPage);
}
await next();
return;
}
// 1. 判断用户是否登录
if (!isLoginUser) {
const { originalUrl } = ctx.request;
const originalUrlEncode = encodeURIComponent(originalUrl);
ctx.redirect(
ctx.app.config.loginPage + `?redirectUrl=${originalUrlEncode}`
);
return;
}
// 2 判断用户状态
const { userStatus } = user;
if (userStatus === userStatusObj.banned) {
goToErrorLoginPage({ error: errorInfoEnum.user_banned });
return;
}
if (userStatus !== userStatusObj.active) {
goToErrorLoginPage({ error: errorInfoEnum.user_status_error });
return;
}
// 3. 判断用户是否有当前app的权限
if (appType === 'multiApp') {
const targetUserApp = userAppList && userAppList.find(x => x.appId === appId);
if (!targetUserApp) {
goToErrorLoginPage({ error: errorInfoEnum.request_app_forbidden });
return;
}
}
// 4. 判断用户是否有 当前 packagePage 的权限
const isNotAllow = !allowPageList.some(page => page.pageId === pageId);
if (isNotAllow) {
goToErrorPage({ error: errorInfoEnum.page_forbidden });
return;
}
// 5. 已登录 从登录页自动则重定向到首页
if (pageId === 'login' && isLoginUser && !ctx.request.query.errorCode) {
ctx.redirect(ctx.app.config.indexPage);
}
await next();
};
};