mirror of https://github.com/chillzhuang/Sword
56 lines
1.8 KiB
JavaScript
56 lines
1.8 KiB
JavaScript
import React from 'react';
|
|
import Exception from '../Exception';
|
|
import CheckPermissions from './CheckPermissions';
|
|
/**
|
|
* 默认不能访问任何页面
|
|
* default is "NULL"
|
|
*/
|
|
const Exception403 = () => <Exception type="403" />;
|
|
|
|
// Determine whether the incoming component has been instantiated
|
|
// AuthorizedRoute is already instantiated
|
|
// Authorized render is already instantiated, children is no instantiated
|
|
// Secured is not instantiated
|
|
const checkIsInstantiation = target => {
|
|
if (!React.isValidElement(target)) {
|
|
return target;
|
|
}
|
|
return () => target;
|
|
};
|
|
|
|
/**
|
|
* 用于判断是否拥有权限访问此view权限
|
|
* authority 支持传入 string, function:()=>boolean|Promise
|
|
* e.g. 'user' 只有user用户能访问
|
|
* e.g. 'user,admin' user和 admin 都能访问
|
|
* e.g. ()=>boolean 返回true能访问,返回false不能访问
|
|
* e.g. Promise then 能访问 catch不能访问
|
|
* e.g. authority support incoming string, function: () => boolean | Promise
|
|
* e.g. 'user' only user user can access
|
|
* e.g. 'user, admin' user and admin can access
|
|
* e.g. () => boolean true to be able to visit, return false can not be accessed
|
|
* e.g. Promise then can not access the visit to catch
|
|
* @param {string | function | Promise} authority
|
|
* @param {ReactNode} error 非必需参数
|
|
*/
|
|
const authorize = (authority, error) => {
|
|
/**
|
|
* conversion into a class
|
|
* 防止传入字符串时找不到staticContext造成报错
|
|
* String parameters can cause staticContext not found error
|
|
*/
|
|
let classError = false;
|
|
if (error) {
|
|
classError = () => error;
|
|
}
|
|
if (!authority) {
|
|
throw new Error('authority is required');
|
|
}
|
|
return function decideAuthority(target) {
|
|
const component = CheckPermissions(authority, target, classError || Exception403);
|
|
return checkIsInstantiation(component);
|
|
};
|
|
};
|
|
|
|
export default authorize;
|