Secured.jsx 2.1 KB
Newer Older
徐立's avatar
徐立 committed
1 2 3 4 5 6 7 8 9
import React from 'react';
import CheckPermissions from './CheckPermissions';
/**
 * 默认不能访问任何页面
 * default is "NULL"
 */

const Exception403 = () => 403;

10 11 12 13 14
export const isComponentClass = (component) => {
	if (!component) return false;
	const proto = Object.getPrototypeOf(component);
	if (proto === React.Component || proto === Function.prototype) return true;
	return isComponentClass(proto);
徐立's avatar
徐立 committed
15 16 17 18 19
}; // 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

20 21 22 23 24
const checkIsInstantiation = (target) => {
	if (isComponentClass(target)) {
		const Target = target;
		return (props) => <Target {...props} />;
	}
徐立's avatar
徐立 committed
25

26 27 28
	if (React.isValidElement(target)) {
		return (props) => React.cloneElement(target, props);
	}
徐立's avatar
徐立 committed
29

30
	return () => target;
徐立's avatar
徐立 committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
};
/**
 * 用于判断是否拥有权限访问此 view 权限
 * authority 支持传入 string, () => 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, () => 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) => {
49 50 51 52 53 54
	/**
	 * conversion into a class
	 * 防止传入字符串时找不到staticContext造成报错
	 * String parameters can cause staticContext not found error
	 */
	let classError = false;
徐立's avatar
徐立 committed
55

56 57 58
	if (error) {
		classError = () => error;
	}
徐立's avatar
徐立 committed
59

60 61 62
	if (!authority) {
		throw new Error('authority is required');
	}
徐立's avatar
徐立 committed
63

64 65 66 67
	return function decideAuthority(target) {
		const component = CheckPermissions(authority, target, classError || Exception403);
		return checkIsInstantiation(component);
	};
徐立's avatar
徐立 committed
68 69 70
};

export default authorize;