refactor: association block acl improve (#2682)

This commit is contained in:
katherinehhh 2023-09-20 11:42:28 +08:00 committed by GitHub
parent ebc1d1afb4
commit 64b5471084
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 33 deletions

View File

@ -5,7 +5,7 @@ import { Navigate } from 'react-router-dom';
import { useAPIClient, useRequest } from '../api-client'; import { useAPIClient, useRequest } from '../api-client';
import { useAppSpin } from '../application/hooks/useAppSpin'; import { useAppSpin } from '../application/hooks/useAppSpin';
import { useBlockRequestContext } from '../block-provider/BlockProvider'; import { useBlockRequestContext } from '../block-provider/BlockProvider';
import { useCollection } from '../collection-manager'; import { useCollection, useCollectionManager } from '../collection-manager';
import { useResourceActionContext } from '../collection-manager/ResourceActionProvider'; import { useResourceActionContext } from '../collection-manager/ResourceActionProvider';
import { useRecord } from '../record-provider'; import { useRecord } from '../record-provider';
import { SchemaComponentOptions, useDesignable } from '../schema-component'; import { SchemaComponentOptions, useDesignable } from '../schema-component';
@ -148,6 +148,7 @@ const useResourceName = () => {
export function useACLRoleContext() { export function useACLRoleContext() {
const { data, getActionAlias, inResources, getResourceActionParams, getStrategyActionParams } = useACLRolesCheck(); const { data, getActionAlias, inResources, getResourceActionParams, getStrategyActionParams } = useACLRolesCheck();
const allowedActions = useAllowedActions(); const allowedActions = useAllowedActions();
const { getCollectionJoinField } = useCollectionManager();
const verifyScope = (actionName: string, recordPkValue: any) => { const verifyScope = (actionName: string, recordPkValue: any) => {
const actionAlias = getActionAlias(actionName); const actionAlias = getActionAlias(actionName);
if (!Array.isArray(allowedActions?.[actionAlias])) { if (!Array.isArray(allowedActions?.[actionAlias])) {
@ -159,6 +160,7 @@ export function useACLRoleContext() {
...data, ...data,
parseAction: (actionPath: string, options: any = {}) => { parseAction: (actionPath: string, options: any = {}) => {
const [resourceName, actionName] = actionPath.split(':'); const [resourceName, actionName] = actionPath.split(':');
const targetResource = resourceName?.includes('.') && getCollectionJoinField(resourceName)?.target;
if (!getIgnoreScope(options)) { if (!getIgnoreScope(options)) {
const r = verifyScope(actionName, options.recordPkValue); const r = verifyScope(actionName, options.recordPkValue);
if (r !== null) { if (r !== null) {
@ -168,6 +170,9 @@ export function useACLRoleContext() {
if (data?.allowAll) { if (data?.allowAll) {
return {}; return {};
} }
if (inResources(targetResource)) {
return getResourceActionParams(`${targetResource}:${actionName}`);
}
if (inResources(resourceName)) { if (inResources(resourceName)) {
return getResourceActionParams(actionPath); return getResourceActionParams(actionPath);
} }

View File

@ -6,6 +6,7 @@ import { CollectionProvider } from '../../../collection-manager';
import { useSchemaOptionsContext } from '../../../schema-component'; import { useSchemaOptionsContext } from '../../../schema-component';
import Select from '../select/Select'; import Select from '../select/Select';
import { useAssociationFieldContext, useInsertSchema } from './hooks'; import { useAssociationFieldContext, useInsertSchema } from './hooks';
import { ACLCollectionProvider, useACLActionParamsContext } from '../../../acl';
import schema from './schema'; import schema from './schema';
export const InternalSubTable = observer( export const InternalSubTable = observer(
@ -14,6 +15,7 @@ export const InternalSubTable = observer(
const fieldSchema = useFieldSchema(); const fieldSchema = useFieldSchema();
const insert = useInsertSchema('SubTable'); const insert = useInsertSchema('SubTable');
const { options } = useAssociationFieldContext(); const { options } = useAssociationFieldContext();
const { actionName } = useACLActionParamsContext();
useEffect(() => { useEffect(() => {
insert(schema.SubTable); insert(schema.SubTable);
field.required = fieldSchema['required']; field.required = fieldSchema['required'];
@ -27,6 +29,7 @@ export const InternalSubTable = observer(
}; };
return ( return (
<CollectionProvider name={options.target}> <CollectionProvider name={options.target}>
<ACLCollectionProvider actionPath={`${options.target}:${actionName}`}>
<FormLayout <FormLayout
className={css` className={css`
.ant-formily-item-bordered-none { .ant-formily-item-bordered-none {
@ -61,6 +64,7 @@ export const InternalSubTable = observer(
/> />
</SchemaOptionsContext.Provider> </SchemaOptionsContext.Provider>
</FormLayout> </FormLayout>
</ACLCollectionProvider>
</CollectionProvider> </CollectionProvider>
); );
}, },

View File

@ -37,7 +37,7 @@ const useTableColumns = (props) => {
const { exists, render } = useSchemaInitializer(schema['x-initializer']); const { exists, render } = useSchemaInitializer(schema['x-initializer']);
const columns = schema const columns = schema
.reduceProperties((buf, s) => { .reduceProperties((buf, s) => {
if (isColumnComponent(s) && schemaInWhitelist(Object.values(s.properties || {}).pop(), props?.isSubTable)) { if (isColumnComponent(s) && schemaInWhitelist(Object.values(s.properties || {}).pop())) {
return buf.concat([s]); return buf.concat([s]);
} }
return buf; return buf;