2017-05-13 3 views
1

"MustBeAdmin"및 "MustBeUser"라는 미들웨어를 만들어서 사용자 로그인에 따라 올바른 페이지로 리디렉션하고 권한이없는 콘텐츠를 제한하는지 확인했습니다. 현재 모든 것이 잘 작동하고 잘 리디렉션됩니다. 그러나 내가 현장에서 쓴 논리는 나에게 틀린 것처럼 보인다. 그리고 이상하게도 여전히 작동한다. 나는 적어도 나에게 맞는 논리를 쓰면 예상대로 작동하지 않는 것 같다.Laravel 5.4 관리자와 사용자 역할을위한 미들웨어

사용자 테이블

id (1,2,3,...) 
name 
role (1,2,3,...) 

역할 테이블

id (1,2,3,...) 
role (Student, Admin,...) 

MustBeAdmin 미들웨어

public function handle($request, Closure $next) 
    { 
     if($request->user()->role == 2) 
     { 
      return $next($request); 
     } 
     else 
     { 
      return redirect('/admin/users'); 
     } 

    } 

MustBeUser 미들웨어 :

public function handle($request, Closure $next) 
    { 
     if($request->user()->role == 1) 
     { 
      return $next($request); 
     } 
     else 
     { 
      return redirect('/admin/users'); 
     } 

    } 

kernel.php

'admin' => \App\Http\Middleware\MustBeAdmin::class, 
'user' => \App\Http\Middleware\MustBeUser::class, 

당신은 내가 커널에서 미들웨어를 등록 볼 수 있듯이.

내가 원하는 결과를 얻고 있지만 미들웨어의 논리가 맞는지 의심 스럽습니까? 사용자 역할 1 (학생) 인 경우

1 = Student 
2 = Admin 

당신이 다음 ($ 요청을) 할 사용자 역할이 (관리자) 인 경우 내가 비교하고 MustBeAdmin 미들웨어에서 볼 경우 MustBeUser 미들웨어에서 나는 다음 (다음에 무엇을 비교하고 $ request) 그리고/Admin 디렉토리에 else를 설정합니다.

내가 잘못 생각합니다. 어떻게 생각하십니까?

+0

둘 다 왜 같은 페이지로 리디렉션됩니까? 관리자와 사용자 외에 세 번째 엔티티가 있습니까? 누가 관리자/사용자로 리디렉션됩니까? –

답변

2

미들웨어에서 인증 된 사용자 세부 정보를 확인하지 않습니다. 당신은 here

+0

5 개의 역할이있는 경우 처리해야 할 5 개의 미들웨어를 만들어야합니까? 공용 파일에서 관리 할 수 ​​있습니까? – user3575353

+0

@ user3575353 아티산을 사용하여 미들웨어를 만들고 기본적으로 미들웨어 이름을 사용하여 새 파일을 생성하므로 단일 파일에서 수행 할 수 있다고 생각하지 않습니다. –

1

예, 그것은 하나 개의 공통 파일로 처리 할 수있는 동일한 주제에 내 자세한 답변을 확인해야

//for student 
public function handle($request, Closure $next) 
{ 

    if (Auth::check() && Auth::user()->role == 1) 
    { 
     return $next($request); 
    } 

    return redirect('/admin'); 

} 


//for admin 
public function handle($request, Closure $next) 
{ 

    if (Auth::check() && Auth::user()->role == 2) 
    { 
     return $next($request); 
    } 

    return redirect('/student'); 

} 

: 뭔가 같은 미들웨어해야한다. 다음은 코드

public function handle($request, Closure $next) 
{ 
    $user = User::find(Auth::id()); 
    $roles = []; 
    foreach ($user->roles as $key => $value) { 
     array_push($roles, $value->pivot->role_id); 
    } 

    $routeName = Route::getFacadeRoot()->current()->uri(); 
    $route = explode('/', $routeName); 
    if ($route[0] == "teacher") { 
     if (in_array(2, $roles)) { 
      return $next($request); 
     } else { 
      return response('Unauthorized.', 401); 
     } 
    } elseif ($route[0] == "student") { 
     if (in_array(1, $roles)) { 
      return $next($request); 
     } else { 
      return response('Unauthorized.', 401); 
     } 
    } elseif ($route[0] == "admin") { 
     if (Auth::user()->admin == 1) { 
      return $next($request); 
     } else { 
      return response('Unauthorized.', 401); 
     } 
    } else { 
     if (!Auth::user()) { 
      if ($request->ajax()) { 
        return response('Unauthorized.', 401); 
      } else { 
        return redirect()->guest('admin-panel/auth/login'); 
      } 
     } 
    } 

    return $next($request); 
} 

당신은 당신의 필요에 따라 논리를 변경할 수 있습니다.