fix(core,board,ecommerce,page): 중첩 리소스 스코프·계층 무결성 결함 12건 일괄 수정
중첩 라우트의 상위 리소스 ID 를 조회 스코프에 반영하지 않아 A 의 경로로 B 의 하위 리소스를 읽거나 변경할 수 있었다. 방어 위치를 Repository where 절(SSoT)로 통일하고 컨트롤러 사후 비교에 의존하지 않게 했다. 같은 리소스의 형제 엔드포인트가 서로 다른 강도로 검증하던 부분도 맞췄다. 계층 리소스는 자기 자신·자손을 부모로 지정하는 순환을 검증 계층에서 차단하고, 검증을 우회하는 경로(시더/훅/오염 데이터)를 위해 path 재귀에 방문 ID 가드를 뒀다. 설정값이 정하는 깊이 상한을 Service 가 리터럴로 재클램프하던 부분을 제거해 게시판 설정이 실제로 적용되게 했다. 쓰기 경로는 validated 기준으로 좁혀 FormRequest 미정의 필드가 fillable 로 새지 않게 했다. 기존 오염 데이터는 업그레이드 스텝이 정리한다(삭제 없이 최상위로 이동). 재발 방지로 audit 룰 3종을 추가하고, 규정 문서와 트러블슈팅 사례를 함께 갱신했다. 공개 이슈: gnuboard/g7
This commit is contained in:
@@ -45,7 +45,7 @@ class MenuService
|
||||
/**
|
||||
* 메뉴 관리 화면용 최상위 메뉴 목록을 반환합니다 (활성 모듈/플러그인 식별자 기준 필터링).
|
||||
*
|
||||
* @param User|null $user 권한 평가 기준 사용자 (null 이면 권한 필터 미적용)
|
||||
* @param User|null $user 권한 평가 기준 사용자 (null 이면 권한 필터 미적용)
|
||||
* @return Collection 메뉴 관리 화면용 최상위 메뉴 컬렉션
|
||||
*/
|
||||
public function getTopLevelMenusForManagement(?User $user = null): Collection
|
||||
@@ -59,8 +59,8 @@ class MenuService
|
||||
/**
|
||||
* 검색/필터 조건이 적용된 메뉴 관리 화면용 최상위 메뉴 목록을 반환합니다.
|
||||
*
|
||||
* @param array $filters 검색 조건 (예: q, source 등)
|
||||
* @param User|null $user 권한 평가 기준 사용자
|
||||
* @param array $filters 검색 조건 (예: q, source 등)
|
||||
* @param User|null $user 권한 평가 기준 사용자
|
||||
* @return Collection 필터링된 최상위 메뉴 컬렉션
|
||||
*/
|
||||
public function getFilteredMenusForManagement(array $filters, ?User $user = null): Collection
|
||||
@@ -127,7 +127,7 @@ class MenuService
|
||||
* 검증은 UpdateMenuRequest에서 수행됩니다.
|
||||
* - slug unique 검증: FormRequest rules (자기 자신 제외)
|
||||
* - parent_id exists 검증: FormRequest rules
|
||||
* - 자기 자신을 부모로 설정 방지: NotSelfParent Custom Rule
|
||||
* - 자기 자신·자손을 부모로 설정 방지: NotCircularParent Custom Rule
|
||||
*
|
||||
* @param Menu $menu 업데이트할 메뉴 모델
|
||||
* @param array $data 업데이트할 데이터
|
||||
|
||||
Reference in New Issue
Block a user