Impersonating Users in Laravel And Example of TDD using PHPUnit

안녕 얘들 아, 우리 채널에 오신 것을 환영합니다 오늘은이 비디오에서 가장 한 사용자에 대해 이야기하겠습니다

프로젝트의 상황을 고려하십시오 사용자가 설명 할 수없는 상황이 발생합니다 이러한 상황에서 문자 그대로 흉내낼 수 있다면 유용합니다 로그인 자격 증명을 쓰지 않고 계정에 로그인하고 다음 작업을 수행하십시오 그들을 대신해서

또는 사용자가 오류가 발생하면 자신의 오류를 볼 수 있습니다 이 동영상에서 개발할 데모 앱은 다음과 같습니다 이미 Harish라는 관리자 계정으로 로그인하고 있습니다 관리자 슬래시 가장 자리 페이지로 이동합니다 여기서 우리는 다른 사용자의 이메일 주소 (예 : john@example

com)를 입력 할 수있는 간단한 양식을 가지고 있습니다 클릭 할 때 가장 버튼을 클릭합니다 자, 이제 우리는 그 이메일 주소를 사용하여 로그인했습니다 이제 우리는 자신이 필요한 모든 것을 할 수 있습니다 여기서 버튼을 가장하는 것을 중지했습니다

이제이 버튼을 클릭하면 관리자 계정 Harish로 다시 전환됩니다 이 기능을 개발하기 위해 PHPUnit 테스트 케이스도 작성합니다 따라서이 채널을 처음 사용하는 경우 앞으로 이동하기 전에 빨간색 가입 버튼을 누르십시오 벨 아이콘을 누릅니다 따라서 곧 출시 될 비디오를 놓칠 수 없습니다

이제 시작하겠습니다 먼저, 새로운 Laravel 프로젝트를 만들 것입니다 가장이라는 이름을 지어 봅시다 다음으로 cd 가장합니다 이 프로젝트를 편집기에서 엽니 다

이제 우리는 dot env 파일로 데이터베이스를 구성 할 것입니다 이미 mysql에 데이터베이스를 만들었습니다 그래서, 여기서 데이터베이스 이름은 가장이고, DB 사용자 이름은 qirolab이고 암호는 비밀입니다 터미널에서, 나는 php artisan을 실행하여 빠른 인증을 생성하는 인증을한다 발판

다음으로 우리는 PHP artisan migrate를 실행하여 데이터 베이스 다음 단계는 테스트 케이스를 위해 phpunitxml 파일을 구성하는 것입니다 아래쪽에서 데이터베이스 자격 증명을위한 환경 변수를 추가 할 것입니다 여기에 DB_CONNECTION sqlite를 추가 할 것입니다

config databasephp 파일이 보이면 여기 sqlite, 우리는 DB 데이터베이스를 추가해야합니다 그래서 phpunitxml에서 우리는 메모리에 DB_DATABASE를 추가 할 것입니다 테스트를 실행하기 위해 일반적으로 SQLite in-memory 데이터베이스를 사용합니다

테스트를 위해 데이터베이스의 트랜잭션, SQLite 메모리 내에서 이러한 트랜잭션 수행 매우 빨라서 몇 초 안에 수백 건의 테스트를 수행 할 수 있습니다 이제 모든 기본 구성이 완료되었습니다 이제 우리는 사용자 기능을 가장하려고 시도 할 것입니다 시험을 치러 시작할 것입니다 당신은 우리가 ExampleTest

php 파일을 가지고 테스트 기능에서 볼 수 있습니다, 그럼, 이것을 삭제하자 Unit 디렉토리에서 ExampleTestphp 파일을 볼 수도 있습니다 이것도 삭제하십시오 다음, 터미널에서, 나는 PHP를 장인이 테스트를 가장 할 사용자 테스트를 실행합니다 그것은 테스트 기능 디렉토리에 ImpersonateUserTest

php 파일을 만듭니다 상상할 수있는 것처럼, 이와 같이 사용자가 로그인 할 수있는 엔드 포인트를 노출하면 사용자라면이 끝점이 확실히 보호되어야합니다 관리자 만 열 수 있습니다 이를 위해 관리자가 아닌 사용자가 가장 할 수없는 페이지를 만들 수 없습니다 이제 우리가 손님이라면 관리자 슬래시에 액세스 할 수있는 권한이 없습니다

엔드 포인트를 가장하려고합니다 따라서 관리자 슬래시를 가장하려고 시도하면 가장 할 수 있습니다 로그인 페이지로 리디렉션됩니다 이제 이것을 테스트하기 위해 터미널에서 우리는 공급 업체 bin phpunit, 내 터미널에서 필자는 PHPUnit 별칭을 만들었습니다 따라서이 긴 경로를 실행하는 대신 PHPUnit을 실행할 수 있습니다

여기에 응답 상태 코드 [404]가 예상대로 생성됩니다 끝 점이 아직 없습니다 이제 webphp로 이동하여 여기에 경로를 추가하겠습니다 경로는 관리자가 가장합니다

나는 항상 Admin 네임 스페이스에 관리 경로를 추가하려고합니다 여기 컨트롤러는 Admin ImpersonateController @ index입니다 이제 PHPUnit을 다시 실행하면 500 개의 상태 코드가 생성됩니다 그러나 그것은 어떤 오류에 대한 피드백을 표시하지 않았습니다 그럼, 우리가 뭘할지, 여기 전화 할게

이것은 예외 처리 방법이 없습니다 PHPUnit을 다시 실행하십시오 이제 문제에 대한 적절한 피드백을 얻었습니다 이 가장 컨트롤러는 존재하지 않습니다 나는 항상 예외 처리없이 우리의 테스트를 좋아한다

테스트가 실패 할 경우 항상 적절한 피드백을보고 싶어합니다 따라서 문제가 무엇인지 쉽게 확인할 수 있습니다 그래서, TestCasephp에서, 여기서 우리는 public function setUp을 말할 것입니다 부모 집합 여기서 예외 처리없이 이것을 호출 할 것입니다

이제 여기서이를 삭제할 수 있습니다 다시 phpunit을 실행 해 봅시다 여기에 올바른 피드백이 있습니다이 가장 컨트롤러는 존재하지 않습니다 이제이 컨트롤러를 만들어 보겠습니다

PHP 장인 확인 : 컨트롤러 Admin \ ImpersonateController PHPUnit 실행 이제 인덱스 메소드가 존재하지 않습니다 이 방법을 만들어 보겠습니다 App Http 컨트롤러 Admin Impersonate 컨트롤러, 공개 함수 인덱스 다시 테스트를 실행하십시오 이제 우리는 200 개의 상태 코드를 얻습니다 그것은 인덱스 메소드를 치고 있습니다

하지만 여기서 우리는 로그인 페이지로 리다이렉트하는 것을 주장하고 싶다 자, 이제이 메소드를 작성해 보겠습니다 이 미들웨어와 패스 인증 그럼 다시 한번 시도해 봅시다 이번에는 예상대로 인증되지 않은 예외가 발생합니다

그래서, 초록색으로 만드십시오 여기 TestCasephp에서 이것을 주석 처리 할 수 ​​있습니다 실행 phpunit, 이제 그것은 녹색과 우리의 테스트가 전달됩니다 또는 우리가 할 수있는 일을 주석 처리하십시오

여기에 Exception Handling을 추가 할 수 있습니다 다시 한 번 쏴, 우리는 녹색이된다 로그인하지 않은 상태에서이 엔드 포인트를 방문하면 로그인 페이지로 이동해야합니다 그러나 사용자가 로그인 한 것으로 가정 해 봅시다 그래서 우리는 이것을 사용자라고합니다

이 사용자를 생성합시다 공장 App 사용자 클래스 만들기 그리고 여기 똑같은 일을 다시하고 상태 코드를 주장 할 것입니다 403입니다 그래서이 방법으로 우리는 당신이 손님이고이 일을하려고한다면 그것이 안된다는 것을 확인할 수 있습니다 일하다

그리고 일반 사용자라면 아무 것도 작동하지 않을 것입니다 우리는 테이블 사용자가 아니더라도 다시 실행할 것입니다 이것은 우리가 데이터베이스 새로 고침을 사용해야하기 때문입니다 테스트가 끝난 후 테스트 및 롤백 다시 한 번 실행하면 403 번이 아니라 200 번 상태가됩니다

이제 여기에는 커스텀 미들웨어 또는 다른 것이 필요합니다 따라서 간단하게 유지하고 사용자가 무언가를 관리 할 수 ​​있는지 여부를 알려 드리겠습니다 그렇게 이제 부팅 서비스 방법에 대한 인증 서비스 제공 업체로 이동합니다 이전에 게이트를 말할 것입니다

함수를 호출하면 사용자를 받아 들일 것이고 여기서는 필요한 논리를 수행하여 현재 인증 된 사용자에게 작업 수행 권한이있는 경우 그럼 여기서 뭘 할거야 사용자 테이블에 역할 열이 있다고 가정 해 보겠습니다 사용자 역할이 admin 인 경우 true를 반환합니다 이제 사용자 테이블에 역할 열을 추가해 보겠습니다 데이터베이스 이주에서 사용자 테이블 이주 파일을 작성하고, 여기에 테이블 문자열 역할을 추가하고 기본값은 회원

phpunit을 실행하고, 클래스 앱 제공 업체가 없습니다 여기에 타이핑 실수가 있습니다 이미 알아 차렸을 것입니다 다시 테스트를 실행하십시오 응답 상태 코드 403은 리디렉션 상태 코드가 아닙니다

우리는 여기서 실패하고 있습니다 이것은 우리가 여기에서 인증 미들웨어를 삭제했기 때문입니다 이것을 다시 추가합시다 PHPUnit과 우리는 녹색 얻을 지금까지 우리는 브라우저에서 이것을 테스트하지 않았습니다

브라우저에서 테스트하기 전에 PHP 숙련자 마이그레이션을 실행 해 봅시다 새로 고침 사용자 테이블에 새 역할 열을 추가했기 때문입니다 다음으로, 나는 터미널을 나눌 것이고 여기서 나는 달릴 것이다 php artisan serve 브라우저에서이 URL 열기 손님으로 admin / impersonate 경로를 방문하려고하면 즉시 리디렉션됩니다 로그인 페이지

이제 새 계정을 등록하십시오 Harish harish@examplecom 암호 및 등록 다시 admin / impersonate 경로를 방문하려고 시도하면 이번에는 403 오류가 발생합니다 관리자가 아닙니다

자, 터미널, php artisan tinker로 가자 사용자가 동일 함 App 사용자의 첫 번째 사용자 역할이 admin과 같습니다 다음으로 사용자 저장 이제 우리는 admin 사용자입니다 이번에는 admin / impersonate에 방문하면 이번에이 페이지에 액세스 할 수 있습니다 물론 우리는 컨트롤러에서 아무것도 인쇄하지 않았기 때문에 여기서는 아무 것도 볼 수 없었습니다

동작 그것을 확인하기 위해 echo "hello"가 출력됩니다 다음 단계는이 페이지에 대한보기를 만드는 것입니다 이제이보기를 만들어 보겠습니다 뷰 관리자 가장 인덱스를 반환합니다

이 인덱스 블레이드 파일을 작성해 보겠습니다 리소스보기 admin impersonate indexbladephp 다음으로 auth loginblade

php에서 일부 마크 업을 강요합니다 여기에서는 사용자를 가장하는 말을 할 것입니다 양식 작업은 admin slash impersonate이며, 이메일 필드가 필요합니다 다음으로이 비밀번호 필드가 필요 없습니다 그래서 이것을 지우십시오

그리고이 기억 영역도 필요하지 않습니다 다음은이 로그인 버튼으로 가장하는 것입니다 그리고 우리는 이것을 필요로하지 않습니다 브라우저에서 보도록하겠습니다 새로 고침

그리고 이것은 우리의 형식입니다 그런 다음이 양식을 제출하고 해당 사용자를 가장하려고합니다 그래서 이것을위한 테스트를 만들어 봅시다 그래서, ImpersonateUserTestphp에서이 테스트와 마찬가지로, 우리는 그것을 원하지 않습니다

관리자가 아닌 사용자가 가장 (impersonate) 요청을 제출할 수 있습니다 따라서 비 관리자 사용자는 사용자를 가장 할 수 없습니다 우리의 테스트가 거의 동일하기 때문에 여기에서 복사 해 봅시다 여기에 게시물 요청을 제출합니다 이것은 또한 게시물 요청입니다

이제 phpunit을 실행하면 405 오류가 발생합니다 우리가 아직 게시 경로를 만들지 않았기 때문입니다 자,이 게시물 경로를 만들어 보겠습니다 webphp에서 이것을 복제하십시오

이것은 게시 경로이며 행동은 가장입니다 이제 PHPUnit을 실행 해 봅시다 그리고 우리는이 가장을 만들지 않았는데도 녹색을 얻습니다 방법 우리는 이미 여기에서 보호를 구현했기 때문입니다

위생 검열을 위해 이것을 설명합시다 우리는 PHPUnit을 사용하여이 특정 테스트를 실행할 수 있습니다 – 필터는 동등하고 테스트합니다 여기서 실패했습니다 이제 주석 처리를 제거하고 다시 실행하십시오 통과합니다

다음으로 관리자가 사용자를 가장 할 수 있는지 확인하기 위해 다른 테스트를 추가해 보겠습니다 여기에는 사용자가 있으며 관리자도 있습니다 사용자 우리는이 역할을 관리자와 동일하게합니다 그런 다음 관리자로 로그인하여 관리자로 로그인합니다

그런 다음이 엔드 포인트를 제출하고 원하는 사용자의 이메일을 전달합니다 의장 그리고 나서 마침내 우리의 주장은이 주장이 될 것입니다 auth id는 사용자와 같습니다 신분증

괜찮아 그래서 우리는 관리자로 로그인하는 것입니다 그런 다음이 엔드 포인트에 게시물 요청을 제출하여 해당 사용자를 가장합니다 그리고 우리가 모든 것을 올바르게했다면 현재 인증 된 사용자는 관리자가되면 이제는 가장하고있는 사용자가됩니다 계속 해보자

물론 그것은 실패합니다 여기서 우리는 오류를 가장하는 메소드가 존재하지 않습니다 자,이 방법을 만들어 보겠습니다 이 테스트를 다시 실행하십시오, 이번에는 오류가 발생합니다 진행합니다

이제 우리의 주장은 실패합니다 2 경기 예상 1 이제이 기능이 어떻게 작동하는지 살펴 보겠습니다 여기에 요청 객체를 가져 오자 자, 여기, 우리는 물론 이메일을 검증하기를 원합니다

전자 메일이 필요하며 전자 메일 주소인지 확인해야합니다 또한 사용자 테이블에 있는지 확인하고 싶습니다 다음으로이 이메일에 연결된 사용자를 찾아 봅시다 사용자는 이메일이 요청 이메일 인 첫 번째 사용자를 잡는 앱 사용자와 같습니다 자, 여기서 내가 할 일은 인증 ID를 세션에 넣을 것입니다

그래서 우리는 session helper를 세션 impersonate_by auth id에 넣을 것입니다 그런 다음 여기에 해당 사용자로 로그인합니다 그래서, 정식 로그인과 패스 사용자 다음으로 홈페이지로 리디렉션합니다 리디렉션 홈으로 돌아갑니다

시험을 치자 이번엔 초록색입니다 이제 브라우저에서 살펴 보겠습니다 브라우저에서이를 테스트하려면 가장 할 새 계정이 필요합니다 이제이 관리 사용자를 로그 아웃하고 새 계정을 등록 해 봅시다

John John@examplecom 암호 및 등록 이 사용자는 회원이며 가장 할 수있는 권한이 없습니다 따라서 로그 아웃하고 관리자로 로그인하십시오 그것은 harish@examplecom입니다

admin slash sperson으로 이동합니다 여기에 회원 사용자 john@examplecom의 전자 메일 주소를 입력합니다 가장을 클릭하십시오 이제 우리는 요한으로 가장하고 있으며 요한을 대신해서 무엇이든지 할 수 있습니다

유일한 문제는 지금 로그 아웃하지 않으면 빠져 나갈 실제 방법이 없다는 것입니다 이제는 버튼을 만들고, 그 버튼을 클릭하면 우리는 가장을 멈추고 관리자에게 다시 로그인하십시오 먼저 테스트를 작성하겠습니다 여기에서 관리자 사용자가 가장 (impersonating)을 중지 할 수 있다고 말합니다 여기에서 모두 복사하십시오

따라서 관리자로 로그인 한 다음이 끝점에 게시물 요청을 제출해야합니다 해당 사용자를 가장하기 위해 여기에 있습니다 그리고 나서 현재 인증 사용자는 관리자가 아니어야합니다 이제는 해당 사용자 여야합니다 이제 가장 (impersonating)을 중지하기 위해이 끝점에 삭제 요청을 보냅니다

다음은이 주장이 auth id가 admin id와 같음을 나타냅니다 이 테스트를 실행 해 보겠습니다 경로를 만들지 않았기 때문에 실패합니다 그래서, webphp에서

이것을 복제하십시오 이것은 삭제 경로입니다 그리고 그 행동은 멈춘다 이제이 테스트를 실행하면 무단으로 예외가 발생합니다 이는이 삭제 요청을 제출할 때이 사용자로 로그인했기 때문입니다

그 사용자는 회원 사용자입니다 가장 (Impersonate) 컨트롤러에서이 경로를 보호했으며 유일한 관리자 만 사용할 수 있습니다 사용자 그래서, 여기서 우리는 중지 방법을 제외한 모든 것을 보호 할 것이라고 말할 것입니다 그리고 여기에 사용자가 가장하는 것을 중지 할 수 있습니다

테스트를 실행하면 다시 실패합니다 중지 방법이 존재하지 않습니다 자,이 방법을 만들어 보겠습니다 테스트를 다시 실행하십시오 이번에는 우리의 주장이 실패합니다

그래서, 우리가 어떻게 통과 시킬지 여기에 우리는 세션에 관리자 아이디를 저장했습니다 그래서, 우리는 그 id를 잡고 그 admin 사용자로 로그인 할 것입니다 그래서 여기에 Auth loginUsingId와 impersonate_by를 가져옵니다 세션에서

이제 더 이상 세션에서 impersonate_by가 필요하지 않습니다 그래서 이것을 지우십시오 세션 impersonate_by을 잊어 버려 그런 다음 관리자 가장을 페이지로 리디렉션합니다 그게 전부예요

테스트를 해보 죠 그리고 이번에는 초록색입니다 이제 브라우저에서이를보고 싶습니다 먼저 가장하지 마세요 버튼을 추가하십시오 탐색 표시 줄에

이를 위해 appbladephp 레이아웃으로 이동해 보겠습니다 바로 여기에 버튼을 추가 할 것입니다 그래서 여기에 우리가 말하길, 세션이 다음으로 가장하여 추가하는 경우 li class nav-item form 메소드 게시 조치는 admin slash impersonate입니다

csrf 토큰 및 메소드 삭제 버튼 클래스 btn btn-link 그리고 여기서 우리는 도용을 중지한다고 말합니다 여기 모두 있습니다 브라우저로 이동합니다 새롭게 하다

여기서 우리는 "도용 중지"버튼을 가지고 있습니다 이것을 클릭하십시오 관리자 인 Harish에게 다시 회신합니다 한 번 더 보자 우리는 john@example

com hit impersonate로 가장 할 것입니다 이제 우리는 John으로 로그인하고 대신 John을 대신하여 조치를 취할 수 있습니다 명의 도용을 중지하면 관리 사용자 Harish에게 다시 전환됩니다 이것은이 비디오의 전부입니다 튜토리얼이 마음에 들면 좋아하는 버튼을 클릭하고이 비디오를 공유하고 구독하는 것을 잊지 마세요

우리 다음 곧 출시 될 비디오에서 곧 만나요