2017-04-14 8 views
1

, 나는이Laravel 중첩 된 리소스 보안

route()->resources('user', 'UserController'); 
route()->resources('user.place', 'PostController'); 
route()->resources('user.place.picture', 'PictureController'); 

모든 것이 잘 작동처럼 자원을 중첩, 나는 때마다 함께 등 사용자의 ID를 전달 ...

트릭은 장소에 올 때입니다. 이것이 내가 너라면 내가 편집하고 몇 가지 작업을하는 버튼을 보여줍니다. 그래서 $place.user_id == $user.id에 버튼이 표시되는지 확인합니다.

예를 들어 내 장소에 액세스하기 위해 Place.show에 대해 /user/1/place/2이라는 URL을 가지고 있기 때문에 조금 재생 한 후.

저는 소유자이기 때문에 버튼을 사용할 수는 있지만 수정할 수는 있지만 다른 사용자 (예 : user_id 2)가 동일한 URL을 사용하여 내 장소를 볼 수는 있지만 아무 것도 수정할 수는 없지만 장소를 볼 수는 있습니다.

내가 찾은 것은이 사용자가 동일한 URL을 사용하지만 user_id를 광산으로 변경하면 해당 장소에 대한 전체 액세스 권한을 가질 수 있다는 것입니다.

그래서이 방지하기 위해 나는 다른 조건을 추가 :이 문제를 방지 할 수있는 솔루션이 있다면 나는 중첩 된 자원의 모든 메소드를 보호해야하는 경우가 오래되고 있기 때문에 Auth::user()->id == $user->id

내가 궁금하고있어,이다 구현하는 것은 추악합니다. 또한 다음 레벨로 올 때 user.place.picture. 나는 내가 갈 때마다 또 다른 보안 계층을 추가해야한다고 생각한다. $picture->place_id == $place->id 등등.

그래서 사용자가 올바른 사용자, 장소, 사진 ID를 클릭 할 수 있도록 링크를 인쇄하면 하나의 ID가 수정되었는지 확인하거나 아무 것도 확인하지 않습니다. 마지막 요소가 수정되면 다른 요소를 검색하므로 아무런 문제가 없습니다. 그러나 부모님의 이드를 수정하면 위험 할 수 있습니다. 특히 액세스 할 때 부여해야합니다.

내가 놓친 간단한 해결책이 있기를 바랍니다.

+0

정책 (https://laravel.com/docs/5.4/authorization)을 확인하십시오. – Robert

답변

2

우선, 나는이 검사를 전혀 수행 할 필요가 없다고 생각합니다.

$place.user_id == $user.id

당신이 발견 한 것처럼 URL에서 파생 된 $user 쉽게 조작 할 수있어 그 보호에 값이 없기 때문에. 을 추가 했으니에 현재 로그인했는지 확인하십시오. UserPlace의 소유자이며, 유일한 수표 여야하며 둘 다 필요하지 않습니다.

정확하게 이해하면 Policies in Laravel을 사용하는 완벽한 사용법처럼 들립니다. 설명서는 매우 포괄적이지만 특정 용도로 사용하도록 노력하겠습니다.

  • Policy을 생성하십시오.PlacePolicy 사용 사례를 들어
  • ,이 정책에서는 매개 변수로 받아 들여진 update() 방법을 만들 것 User (사용자 로그인) 및 Place
  • update() 방법 (장소들이 액세스하려는) User가 그래서 Place

를 업데이트 할 수 있습니다 경우 PlacePolicy는 이제 다음과 같을 수, 어떤 수단으로 확인할 수 있습니다;

<?php 

namespace App\Policies; 

use App\Place; 
use App\User; 

class PlacePolicy 
{ 
    /** 
    * Determine if the given place can be updated by the User. 
    * 
    * @param \App\User $user 
    * @param \App\Place $place 
    * @return bool 
    */ 
    public function update(User $user, Place $place) 
    { 
     return $place->user_id == $user->id; 
    } 
} 

이것은 매우 간단한 검사 -하지만 당신은 기본적으로 주어진 사용자가 다른 모델에 대한 작업을 수행 할 수 있는지 여부를 결정하기 위해 여기에 절대적으로 모든 작업을 수행 할 수 있습니다.

참고 : 당신은 ServiceProvider에서이 정책을 등록해야합니다 장소에서이 Policy

을 수행하는 방법에 위의 링크 된 문서를 참조하십시오, 당신은 유용한 도구의 배열을 이용할 수 있습니다 Laravel이 제공합니다. 또한 페이지를 방지하기 위해 Middleware를 통해 Policy 클래스를 적용 할 수 있습니다

@can('update', $place) 
    < SHOW THE EDIT BUTTON > 
@endcan 

처음에 액세스하고 : 희망이

Route::get('/user/{user}/place/{place}' .....)->middleware('can:update,place'); 

예를 들어, 당신은 이런 식으로 뭔가를 할 can 지시 블레이드를 활용할 수 당신의 길을 가는데 충분합니다! :)