Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Master Devise:Ruby on Rails 인증에 대한 필수 가이드

20,000명이 넘는 GitHub 스타와 다양한 통합 기능을 갖춘 Devise gem은 Ruby 환경에서 가장 인기 있는 gem 중 하나입니다. 그렇다면 왜 이것을 Ruby의 "숨겨진" 보석 중 하나로 부르겠습니까? 글쎄요, 인기가 많은 만큼 대부분의 개발자는 라이브러리 기능의 표면적인 부분에만 관심을 쏟고 있습니다.

두 부분으로 구성된 이 시리즈에서는 Devise에 대해 자세히 살펴보겠습니다.

첫 번째 부분에서는 다음을 포함한 몇 가지 기본 사항을 배우게 됩니다.

  • Devise가 무엇이고, 사용하지 않는 몇 가지 상황을 포함하여 Devise를 먼저 사용해야 하는 이유 그것을 사용합니다.
  • Devise를 설치하고 프로젝트에 사용하는 방법
  • 프로젝트에 맞게 라이브러리를 맞춤설정하는 방법

2부에서는 다음을 포함하여 Devise의 고급 사용법을 살펴보겠습니다.

  • OmniAuth 및 API 전용 애플리케이션용 Devise 사용
  • Devise를 인증 라이브러리와 통합합니다.

시작해 보세요!

전제조건

이 튜토리얼에서는 사용자와 작업을 특징으로 하는 간단한 Ruby on Rails 7 애플리케이션을 사용합니다. 사용자는 create에 액세스하여 등록, 로그인 및 로그아웃할 수 있습니다. , read , updatedelete 할당된 역할에 따라 작업에 대한 조치를 취합니다.

우리는 이 앱을 사용하여 더욱 복잡한 기능을 점진적으로 구축하고 그 과정에서 Devise의 강력한 기능이 실제로 작동하는 모습을 선보일 것입니다.

먼저 Devise에 대한 간단한 소개부터 시작하겠습니다.

Ruby용 Devise 소개

Devise는 Rack 기반 인증 프레임워크인 Warden을 기반으로 구축된 인증 라이브러리입니다.

Warden은 로그인한 사용자의 신원을 확인하기 위해 보안 세션 문자열을 사용하여 사용자 세션을 처리합니다. 또한 아닌 사용자도 처리합니다. 제한된 리소스에 접근할 수 없도록 로그인했습니다.

그러나 Warden은 순전히 랙 기반이므로 적절한 사용자 인증 솔루션을 구축하는 데 필요한 컨트롤러 작업, 보기, 도우미 또는 기타 구성 옵션을 추가하지 않습니다. 반면에 Devise는 그렇습니다.

Devise의 또 다른 주목할만한 특징은 모듈성입니다. 라이브러리에는 애플리케이션에서 인증 처리 방법을 정확하게 지정할 수 있는 약 10개의 모듈이 함께 제공됩니다. 10개의 모듈을 모두 사용할 필요는 없습니다. 대신 앱에 필요한 것만 활성화하고 사용하면 됩니다. 나중에 Registerable을 포함하는 이러한 모듈을 살펴보겠습니다. 모듈, Omniauthable , Trackable , 기타 등등.

이를 염두에 두고 Tasks 앱 구축을 시작하고 Devise를 설치해 보겠습니다.

시작하기:Devise 설치

bundle exec rails new tasks_app를 사용하여 새로운 Rails 7 앱 생성 . 또는 저장소에서 예시 앱의 코드를 가져오세요.

앱의 루트 디렉터리에 있는지 확인한 다음 bundle add devise를 실행하세요. . 이렇게 하면 Devise gem이 앱의 Gemfile에 추가됩니다. 그런 다음 bundle exec rails g devise:install을 실행하세요. Devise를 설치하고 초기화 파일을 생성합니다(Devise 모듈을 살펴볼 때 이 파일을 자세히 살펴보겠습니다).

이 명령을 실행하면 생성기는 Devise가 예상대로 작동하도록 몇 가지 설정 제안도 제공합니다. 제공된 지침을 따르기만 하면 됩니다.

다음으로 Devise가 작업할 사용자 모델을 생성해 보겠습니다.

Devise 사용자 모델 생성

Devise에는 사용자 모델이 필요합니다. 이 모델이라고 부르는 것은 전적으로 귀하의 선호도와 앱의 사용 사례에 따라 다르지만 일반적으로 User입니다. 또는 Admin .

bundle exec rails g devise User를 사용하여 Devise 사용자 모델을 생성해 보세요. . 그러면 User이 생성됩니다. app/models/user.rb의 모델 , 사용자 테이블을 생성하기 위한 마이그레이션 파일 및 사용자 리소스에 액세스하기 위한 경로:

 

bundle exec rails db:migrate 실행 마이그레이션을 실행하고 사용자 테이블을 설정합니다. 이를 완료하면 이제 모든 인증에 사용할 수 있는 사용자 모델이 생겼습니다.

다음으로 앞으로 나아갈 작업 모델을 설정해 보겠습니다.

작업 모델 생성

Devise를 사용하면 우리의 간단한 앱이 다음을 수행해야 한다는 점을 기억하세요:

  • 사용자가 등록할 수 있도록 합니다.
  • 사용자가 앱에 로그인하고 로그아웃할 수 있도록 설정합니다.
  • 사용자가 자신에게 속할 작업을 생성할 수 있도록 합니다.
  • 사용자의 역할에 따라 사용자가 작업과 상호작용하는 것을 허용(또는 허용하지 않음)합니다.

이를 염두에 두고 이제 사용자가 상호 작용할 작업 모델을 생성해 보겠습니다.

 

이제 작업을 생성한 사용자, 제목, 본문 및 상태(완료 여부 표시)와 연결된 작업 모델이 있어야 합니다.

그런 다음 bundle exec rails db:migrate를 실행하세요. 작업 테이블을 생성합니다. 또한 작업을 사용자와 연결했는지 확인하세요.

 

스캐폴드 생성기를 실행하면 belongs_to :users 관계가 나타납니다. Task 모델에 자동으로 추가됩니다. 마찬가지로, enum를 사용하도록 작업 모델을 편집하세요. 상태는 아래와 같습니다:

 

이제 Devise에 대해 더 깊이 알아볼 준비가 되었습니다. Devise 모듈에 대한 간략한 개요부터 시작해 보겠습니다.

Ruby용 Devise의 모듈

서문에서 언급했듯이 Devise의 주요 기능 중 하나는 모듈성입니다. 하지만 이 경우 "모듈성"은 실제로 무엇을 의미합니까? 이는 단순히 인증 프로세스를 독립적으로 관리할 수 있는 여러 부분으로 분리하는 것을 의미합니다.

최신 버전의 Devise(작성 당시)에는 10개의 모듈이 포함되어 있습니다:

  1. 데이터베이스 인증 가능 - 이 모듈은 사용자가 제공한 비밀번호를 가져와 보안 해시로 변환한 다음 데이터베이스에 저장합니다. 또한 모듈은 사용자가 로그인할 때 확인을 처리합니다.
  2. 모든 인증 가능 - OmniAuth 인증을 활성화합니다.
  3. 잠금 가능 - 이 모듈은 로그인 실패 횟수에 따라 계정을 잠급니다. 일정 기간이 지나면 또는 이메일을 통해 계정에 다시 액세스할 수 있습니다.
  4. 추적 가능 - 계정의 로그인 횟수, 사용된 IP 주소, 로그인 타임스탬프를 추적합니다.
  5. 확인 가능 - 계정 등록 시 확인 지침이 포함된 이메일을 보내고, 로그인 시 사용자 계정이 확인되었는지도 확인합니다.
  6. 등록 가능 - 사용자가 앱에 계정을 등록할 수 있도록 허용하고 계정 편집 및 파기를 처리합니다.
  7. 복구 가능 - 비밀번호 재설정 및 계정 복구를 처리합니다.
  8. 시간 초과 가능 - 지정된 시간이 경과하면 사용자 세션이 만료됩니다.
  9. 유효성 - 이를 통해 계정 생성 중에 사용자가 제공한 이메일 및 비밀번호에 대한 사용자 정의 확인 규칙을 정의할 수 있습니다.
  10. 기억에 남는 - 인증 과정에서 사용자를 기억하기 위해 쿠키를 사용합니다.

더 많은 정보를 알고 싶다면 Devise의 모듈 문서가 도움이 될 것입니다. 지금은 Devise 도우미와 필터로 전환하겠습니다.

도우미 및 필터 고안

Devise와 같은 인증 라이브러리를 사용하는 이유 중 하나는 컨트롤러 리소스 및 관련 뷰에 대한 액세스를 관리하기 위한 것입니다. Devise에는 다음과 같은 편리한 도우미 세트가 포함되어 있습니다.

  • user_signed_in? - 현재 로그인된 사용자가 있는지 확인합니다.
  • current_user - 현재 로그인된 사용자를 참조할 수 있습니다. 예를 들어 current_user.email와 같은 코드 조각을 사용할 수 있습니다. 현재 로그인된 사용자의 이메일을 가져옵니다.
  • user_session - 현재 로그인된 사용자의 세션에 대해서.
  • destroy_user_session_path - 로그인한 사용자의 세션을 삭제하고 지정된 경로 또는 루트 경로로 리디렉션합니다.
  • new_user_session_path - 사용자 로그인 보기로 응답합니다.
  • edit_user_registration_path - 현재 로그인한 사용자에게 등록 세부정보를 편집할 수 있는 보기에 대한 액세스 권한을 부여합니다.
  • new_user_registration_path - 신규 사용자 등록을 위한 등록 양식이 있는 뷰로 응답합니다.

도우미에 대한 내용입니다. 컨트롤러 액세스를 관리하기 위해 Devise는 멋진 before_action를 제공합니다. 필터를 다음과 같이 사용할 수 있습니다:

 

이제 Devise가 Rails의 강력한 매개변수와 어떻게 통합되는지에 초점을 맞춰보겠습니다.

Devise와 Ruby on Rails의 강력한 매개변수

강력한 매개변수는 요청 매개변수를 객체에 대량으로 할당하는 것을 방지하는 잘 알려진 Ruby on Rails 기능입니다. 강력한 매개변수는 일반적으로 컨트롤러 수준에서 할당이 완료되기 전에 요청 매개변수를 명시적으로 선언해야 합니다.

Devise는 또한 적절한 Devise 관련 컨트롤러 작업에서 매개변수를 명시적으로 정의하도록 요구하여 이 기능을 반영합니다.

  • sign_up - 기본적으로 Devise 컨트롤러 Devise::RegistrationsController#create에 있습니다. . 기본적으로 허용되는 키는 email입니다. , passwordpassword_confirmation .
  • sign_in - 컨트롤러 Devise::SessionsController#new에 있습니다. , 기본적으로 허용되는 인증 키 email 그리고 password .
  • account_update - Devise::Registrations#update에서 발견됨 — 인증 키 email , current_password , passwordpassword_confirmation 허용됩니다.

자신의 인증 키를 추가하는 가장 편리한 방법은 before_action을 사용하는 것입니다. ApplicationController으로 필터링하세요. , 여기처럼 username를 추가합니다. 사용자가 가입할 때 필요한 키:

 

Devise의 강력한 매개변수에 대한 흥미로운 사용 사례는 Devise sanitizer에 키 배열을 전달해야 하는 경우입니다. 예를 들어, 사용자가 고용을 위한 "계약자"가 될 수도 있고, 다른 계약자를 고용할 수 있는 "고용주"가 될 수도 있고, 계약자와 고용주가 동시에 될 수도 있는 프리랜서 마켓플레이스 앱이 있다고 가정해 보겠습니다.

너무 많은 기술적인 세부 사항을 다루지 않고도 사용자가 각 역할("계약자" 및 "고용주")에 대한 두 개의 선택 상자를 사용하여 자신의 계정을 업데이트할 수 있도록 하여 사용자가 옵션 중 하나 또는 둘 다를 선택할 수 있도록 함으로써 이 기능을 구현할 수 있습니다.

이를 달성하는 빠른 방법은 역할이 있는 배열을 키로 사용하는 것이지만 Rails의 강력한 매개변수는 다음 스칼라 값만 허용합니다:String , Symbol , NilClass , Numeric , TrueClass , FalseClass , Date , Time , DateTime , StringIO , IO , ActionDispatch::Http::UploadedFileRack::Test::UploadedFile . 보시다시피 배열, 해시 및 기타 개체는 기본적으로 허용되지 않습니다.

사용자에게 여러 역할을 허용하는 배열을 사용하려면 아래와 같이 코드를 수정할 수 있습니다.

 

도우미에 대한 Devise 문서에서 이 주제를 더 자세히 다루고 있습니다.

다음으로 Devise의 뷰와 컨트롤러를 사용자 정의하는 방법을 배우겠습니다.

Devise 뷰 사용자 정의

Devise는 Rails 엔진으로 구축되었기 때문에 거의 모든 구성 요소가 사전 패키지되어 있습니다. 이에 대한 좋은 예로는 로그인, 가입, 계정 세부 정보 업데이트, 비밀번호 재설정 등에 대한 보기가 있습니다. 앱을 구축하는 과정의 어느 시점에서 이러한 기본 제공 보기를 필요에 맞게 사용자 정의해야 할 수도 있습니다.

첫 번째 단계는 bundle exec rails g devise:views 명령을 사용하여 뷰를 생성하는 것입니다. . 그렇게 하면 해당 뷰가 생성되어 app/views/devise에 배치됩니다. 폴더:

Master Devise:Ruby on Rails 인증에 대한 필수 가이드

Devise의 보기를 사용자 정의하는 실제 예를 사용해 보겠습니다. 이전 섹션에서는 Devise sanitizer에 추가 인증 키를 추가하는 방법을 배웠습니다. 이제 해당 예제를 확장하여 username을 추가해 보겠습니다. 필드를 사용자 등록 보기로 이동하세요.

username 이후 필드는 기본 사용자 모델에서 사용할 수 없으므로 bundle exec rails g migration add_column_username_to_user username를 사용하여 추가하겠습니다. 마이그레이션. bundle exec rails db:migrate 명령을 실행하세요. 마이그레이션을 시작하고 사용자 테이블에 열을 추가합니다.

다음으로, 새로운 사용자 등록 파일을 열고 다음과 같이 편집하세요:

 

모든 뷰로 작업하는 경우 Devise 뷰를 이런 방식으로 생성하는 것은 괜찮습니다. 하지만 몇 가지 보기만 사용자 정의하고 싶다고 가정해 보겠습니다. 어떻게 이런 일을 할 수 있나요? 글쎄, 뷰 플래그 bundle exec rails g devise:views -v sessions registrations를 표시하여 원하는 뷰 목록을 생성기 명령에 전달하기만 하면 됩니다. . 이 경우 로그인/로그아웃 프로세스와 가입을 처리하는 뷰만 생성됩니다.

계속해서 라이브러리의 컨트롤러와 경로를 사용자 정의하는 방법을 학습하여 Devise 사용자 정의에 대해 더 자세히 살펴보겠습니다.

Deviise 컨트롤러 및 경로 사용자 정의

Devise의 보기를 사용자 정의하면 지금까지만 얻을 수 있습니다. 실제 사용자 정의를 원한다면 라이브러리의 컨트롤러와 경로로 이동해야 합니다.

앱에 새로운 사용자가 등록될 때마다 이를 알리는 이메일을 관리자에게 보내고 싶다고 가정해 보겠습니다. (이것은 이상적인 방법은 아니지만, 우리가 원하는 것을 설명하기 위해 이 예를 살펴보겠습니다.)

먼저 Devise::RegistrationsController의 가입 작업을 수정해야 합니다. . 일반적으로 Devise의 컨트롤러는 편집을 위해 직접 액세스할 수 없으므로 뷰에서 했던 것처럼 다음과 같이 생성할 수 있습니다:

 

해당 명령의 마지막 비트는 범위입니다. 이 경우에는 users입니다. . 다른 것으로 만들고 싶다면 그에 따라 변경할 수 있습니다. 완료되면 생성된 컨트롤러는 다음과 유사한 구조가 되어야 합니다:

Master Devise:Ruby on Rails 인증에 대한 필수 가이드

다음으로, 경로 파일을 열고 컨트롤러 구조의 변경 사항을 반영하도록 Devise의 경로를 수정합니다.

 

이제 새로 생성된 Users::RegistrationsController을 엽니다. 새로운 사용자가 가입할 때마다 관리자에게 이메일을 보내도록 수정하세요:

 

보시다시피 Devise의 컨트롤러와 작업에 액세스하면 원하는 방식으로 앱의 인증 흐름을 수정할 수 있습니다.

다음 내용:Devise의 고급 사용

두 부분으로 구성된 이 시리즈의 첫 번째 부분에서는 Devise gem의 기본 사항을 다루었습니다. 우리는 Devise의 다양한 모듈과 뷰 및 컨트롤러를 사용자 정의하는 방법에 대해 배웠습니다.

2부에서는 API 인증 및 Devise와 함께 OmniAuth를 사용하는 방법을 포함하여 Devise의 고급 사용법을 살펴보겠습니다.

그때까지 즐거운 코딩 되세요!

추신 Ruby Magic 게시물이 보도되는 즉시 읽으려면 Ruby Magic 뉴스레터를 구독하고 단 하나의 게시물도 놓치지 마세요!