איך להגדיר אימות משתמש עם Devise באפליקציית Rails 7

המחבר בחר ב- Girls Who Code לקבל תרומה כחלק מתוכנית Write for Donations.

הקדמה

האבן האב היא פתרון אימות עבור יישומי Ruby on Rails; היא עוזרת לך להגדיר אימות משתמש עבור פרויקטים שלך הכוללים כניסה משתמש עמוד והוספת תמיכה להתחברות עם OAuth שימוש ב- OmniAuth. האבן מספקת תכונות שימושיות רבות כמו טיפול במספר סשנים משתמש והוספת תמיכה להתחברות עם חשבונות צד שלישי, אפשרות לאפס סיסמאות שנשכחו, מעקב אחר מספר ההתחברויות וציוני זמן, הגדרת טיימאוטים, נעילת חשבונות, ועוד.

האבן הופכת אימות משתמש לפשוט כמו להתחיל את האבן וליצור מודל User עם התכונות הנדרשות. אם היית מבנה אימות משתמש מאפס, היית צריך לכתוב קוד ובדיקות לכל התכונות שתרצה, ולטפל בכל המקרים הקצה בטיפול בסשנים, אחסון עוגיות, ושמירת הנתונים בטוחים. באמצעות האבן, אתה ממנע מעצמך לעשות את כל זה בעצמך ויכול להתמקד בבניית היישום שלך במקום.

במדריך זה, תיצור יישום אינטרנט קטן עם Rails ותתקין את Devise, שיאפשר למשתמשים ליצור חשבונות, להיכנס ולהתנתק מהחשבונות שלהם.

דרישות מוקדמות

כדי להשלים את המדריך הזה, תצטרך:

שלב 1 — יצירת יישום Rails חדש

בשלב זה, תיצור יישום Rails חדש ותפעיל אותו מקומית על המחשב שלך. תשתמש בפקודת שורת הפקודה rails כדי לאתחל את הפרויקט.

הרץ את הפקודה הבאה מהטרמינל:

  1. rails new blog

הפקודה rails new תיצור פרויקט Rails חדש בתיקייה blog, הכוללת מספר קבצים ותיקיות שנוצרו אוטומטית. אחד מהם הוא קובץ ה-Gemfile, שמכיל את תלויות הפרויקט. תגדיר את קובץ ה-Gemfile כך שישתמש ב-Devise ב־שלב 3 — התקנה והגדרת Devise.

הערה: אם תקבל שגיאה שאומרת Could not find gem, תוכל לפתור אותה על ידי העברתך לתיקיית הפרויקט שלך (cd blog) והרצת הפקודה bundle install, שתתקין את כל ה-gems שמופיעים בקובץ ה-Gemfile שלך.

תוכל לפתוח את התיקייה הזו בעורך הטקסט האהוב עליך או לנווט אליה באמצעות הטרמינל:

  1. cd blog

כדי להתחיל ביישום Rails, הפעל את שרת הפיתוח באמצעות הפקודה rails server מתוך תיקיית הפרויקט:

  1. bundle exec rails server

פקודה זו תפעיל את שרת הפיתוח של Rails. פתח http://localhost:3000 בדפדפן שלך כדי לגשת לדף ברכת הפתיחה של Rails. Rails משתמשת בפתח 3000 כדי להפעיל את היישום אם לא סיפקת מספר פתח אלטרנטיבי.

**הערה:*הוספת bundle exec לפקודתך תפעיל אותה בהקשר של החבילה הנוכחית. זה אומר שיעשה שימוש רק בקובץ ה-Gemfile המסוים של הפרוייקט ובגרסאות המגוין שמוגדרות בו. זה שימושי אם יש לך גרסאות שונות של אותם יישומים המותקנים באופן גלובלי.

עכשיו יש לך את אפליקציית ה-Rails החדשה שאתה תוסיף אימות משתמש בשלב מאוחר יותר. בשלב הבא, תחליף את דף הבית הברירת מחדל של Rails עם דף נחיתה מותאם אישית, שיעשה קל יותר לנווט דרך היישום הדוגמא לאחר שתוסיף את Devise. לאחר שתיצור דף נחיתה חדש, תוסיף קישורים עבור המשתמש להירשם ולהתחבר ליישום.

שלב 2 — יצירת דף נחיתה

כעת שיש לך את אפליקציית ה-Rails הבסיסית, תחליף את הדף הברירת מחדל של Rails עם הדף הנחיתה המשלך. דף נחיתה מותאם אישית יקל על ך להציג למשתמש קישורים להרשמה והתחברות ב-URL השורש של היישום. תוסיף קישורים ל התחברות ול הרשמה בשלבים מאוחרים.

כדי ליצור את דף הנחיתה שלך, יהיה עליך לעשות את הבא:

  • הוסף את הנתיב בקובץ config/routes.rb.
  • צור מחלקת HomeController אשר תטפל בבקשות לנתיב זה.
  • צור קובץ תצוגה להצגה כאשר אתה מתמקד בנתיב.

תתחיל בהוספת הנתיב הראשי לקובץ routes.rb שנוצר כאשר יצרת את הפרויקט.

באמצעות nano או העורך הטקסט האהוב עליך, פתח את קובץ config/routes.rb שנוצר בשלב קודם:

  1. nano config/routes.rb

הוסף את השורה המודגשת:

config/routes.rb
Rails.application.routes.draw do
  root to: "home#index" 
end

root to: מגדיר איזו פעולת בקר תטפל בבקשות לנתיב הראשי – במקרה זה, הנתיב יהיה http://localhost:3000, שהוא הפורט הברירת מחדל ליישומי Rails. הבקשות לנתיב זה ייטפלו על ידי הפעולה index בבקר הhome. כרגע הקובץ אינו קיים, אז עליך ליצור את הקובץ app/controllers/home_controller.rb.

שמור וסגור את config/routes.rb. באמצעות nano, הקש CTRL+X כדי לצאת, Y כדי לשמור, וENTER כדי לאשר את שם הקובץ ולסגור את הקובץ.

לבארץ, צור את הקובץ app/controllers/home_controller.rb והוסף את השורות הבאות:

app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
    render
  end
end

זו מחלקת HomeController בסיסית עם שיטת index שעושה דבר אחד: מציגה את קובץ התצוגה המשוייך לפעולת הבקר.

במקרה זה, קובץ התצוגה יהיה קובץ app/views/home/index.html.erb. תצטרך ליצור גם את הקובץ הזה ואת התיקייה home בתוך תיקיית app/views.

שמור וסגור את קובץ הבקר home.

לאחר מכן, צור את התיקייה home בתוך תיקיית app/views:

  1. mkdir app/views/home/

התיקייה home תכיל את כל קבצי התצוגה עבור בקר Rails מסוים.

לאחר מכן, צור את קובץ ה-app/views/home/index.html.erb והוסף את השורות הבאות:

app/views/home/index.html.erb
<h1>Hello DigitalOcean!</h1>

app/views/home/index.html.erb הוא קובץ התצוגה שפעולת ה-index של הבקר Home תציג. זהו קובץ HTML שבו ניתן להטמיע קוד Ruby. כאשר הנתיב הוגדר עבור פעולת הבקר הספציפית, קובץ זה נטען בדפדפן המשתמש.

שמור וסגור את הקובץ שלך.

כדי לראות את השינויים בכתובת URL הראשית, פתח http://localhost:3000 בדפדפן שלך (או רענן את העמוד אם הוא כבר פתוח). העמוד הראשי המעודכן יהיה דומה לזה:

ניתן להתאים אישית את העמוד זה נוסף אם נדרש, אך זהו כל מה שנדרש למדריך זה.

עכשיו שיש לך אפליקציה פשוטה של Rails עם דף נחיתה משלה, תוסיף אימות משתמש עם ג'ם ה-Devise.

שלב 3 — התקנה והגדרת Devise

בשלב זה, תתקין ותגדיר את Devise ביישום ה־Rails שלך כך שתוכל להשתמש בשיטות ובעוזרים שמגיעים עם האבן החן. תשתמש בשיטת user_signed_in? כדי לבדוק את מידע ההפעלה של כל משתמש שנרשם החל בעוגיות הדפדפן. תשתמש גם בעוזר current_user כדי לקבל את פרטי החשבון שכרגע מחובר. שתי השיטות מובנות ל־Devise ואתה יכול להשתמש בהן ישירות ביישום שלך מבלי לכתוב קוד נוסף. ניתן ללמוד עוד על שיטות העזר האלו מהעמוד GitHub של פרויקט Devise.

השלב הראשון להתקנת Devise הוא להוסיף את האבן החן לקובץ ה־Gemfile שלך, שמכיל מידע על כל התלויות שנדרשות כדי להפעיל את פרויקט ה־Ruby שלך. במקרה זה, כאשר אתה מאתחל את יישום ה־Rails, ה־Gemfile שנוצר כבר מכיל את כל האבנים הבסיסיות הנדרשות כדי להפעיל את Rails.

אך לפני שתבצע שינויים בקובץ ה־Gemfile שלך, עצור את שרת הפיתוח שאתה מפעיל מהשלב האחרון על ידי לחיצה על CTRL+C בטרמינל שבו הוא פועל.

אז, פתח את קובץ ה־Gemfile שלך לעריכה. כדי להוסיף את אבן החן של Devise, הוסף את השורה המודגשת לסוף הקובץ, אך מחוץ לקבוצות development ו־test:

Gemfile

# ...

# מקטין זמני הטעינה דרך מטמון; דרוש ב־config/boot.rb
gem "bootsnap", require: false

# השתמש בגרסאות אקטיביות של אחסון [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
# אבן "image_processing", "~> 1.2"

gem "devise" 

group :development, :test do
  # ראה https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem "debug", platforms: %i[ mri mingw x64_mingw ]
end

# ...

שמור וסגור את הקובץ.

בשלב הבא, תתקין את האבן החדשה שנוספה על ידי הרצת פקודת bundle install בטרמינל. מתוך ספריית הפרויקט (blog), הרץ את הפקודה הבאה:

  1. bundle install

הפקודה תתקין את האבן Devise בפרויקט שלך, אשר תאפשר לך להשתמש בפקודת devise עם כלי השורת פקודה rails ולהגדיר את האימות.

כדי להגדיר את Devise בפרויקט שלך, הרץ את פקודת היצרן:

  1. bundle exec rails g devise:install

דגל ה־g בפקודה למעלה מיועד ל־generate ומשמש לקריאת מחוללי Rails. מחוללים ייצרו קבצים שיכולים לשמש כנקודת התחלה. ניתן לקרוא את מדריכי Rails למידע נוסף על מחוללי Rails.

הפקודה הקודמת תיצור מספר קבצים, כולל קובץ הגדרות התחלתי וקובץ הגדרות i18n עבור Devise. קובץ ההגדרות התחלתיות, המוסבר מטה בפירוט, משמש להגדיר את Devise בעת התחלת היישום לראשונה. i18n מיוצגת כ-בינלאומיות, שהיא תקן המסייע לך להפעיל את היישום שלך בשפות שונות.

בנקודה זו, הוראות מסוימות יודפסו גם בטרמינל, כך:

Output
=============================================================================== Depending on your application's configuration some manual setup may be required: 1. Ensure you have defined default url options in your environments files. Here is an example of default_url_options appropriate for a development environment in config/environments/development.rb: config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } In production, :host should be set to the actual host of your application. * Required for all applications. * 2. Ensure you have defined root_url to *something* in your config/routes.rb. For example: root to: "home#index" * Not required for API-only Applications * 3. Ensure you have flash messages in app/views/layouts/application.html.erb. For example: <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> * Not required for API-only Applications * 4. You can copy Devise views (for customization) to your app by running: rails g devise:views * Not required * ===============================================================================

למרות שההגדרה הידנית אינה דרושה להדרכה זו, יש להוסיף הודעות מהירות לnotice ולalert מאוחר יותר בשלב זה.

סיימת להתקין את Devise. השלב הבא הוא להגדיר כמה דברים בקובץ הגדרות ההתחלה שנוצר כעת.

כאשר ביצעת את הפקודה devise:install, יוצרת config/initializers/devise.rb, שהוא קובץ ההגדרות התחלתיות של Devise. בכל פעם שאתה מפעיל את יישום ה-Rails שלך, ריילס יטען את כל הג'מס והתוספות, ולאחר מכן יטען את כל קבצי ההגדרות ההתחלתיות. ניתן להגדיר הגדרות ספציפיות לחלקים שונים של היישום שלך מתוך קבצי ההגדרות ההתחלתיים הללו. כל ההגדרות ההתחלתיות הללו נמצאות בתיקיית config/initializers/, ושם יוצר Devise את ההגדרות ההתחלתיות שלו גם.

פתח את config/initializers/devise.rb לעריכה. בקובץ, אתה יכול למצוא את הקטע Devise.setup ולהוסיף את השורה המודגשת הבאה (יתכנו קטעים נוספים של קוד בתוך בלוק ה-Devise.setup, אך ניתן להתעלם מהם):

config/initializers/devise.rb
Devise.setup do |config|
  # ...

  config.navigational_formats = ['*/*', :html, :turbo_stream]

  # ...
end

שורה זו מוסיפה את turbo_stream כפורמט ניווט. טורבו סטרימים הם חלק מ-Turbo, שמאפשר לך לשלוח HTML שנוצר על ידי השרת ולהציג דפים בלעדיו של JavaScript רב. עליך להוסיף זאת עבור Devise 4.8.1 כדי שיעבוד עם Rails 7; אחרת, תקבל שגיאת undefined method user_url.

שמור וסגור את הקובץ.

בנוסף, תוסיף את ההודעות הדהימה וההתראה שהוסברו בהוראות הקודמות. התגיות alert ו־notice הן המקומות בהם הודעות כמו "סיסמה שגויה" וכדומה יופיעו בממשק המשתמש. תמיד ניתן לממש הודעות התראה מותאמות אישית באפליקציה שלך (לדוג, אם אתה משתמש באינטרספטורים של Axios עם React כפרי-אנד), אך במסגרת המדריך הזה, תשלים את ההתקנה המינימלית עבור Devise.

פתח את app/views/layouts/application.html.erb לעריכה. הוסף את התגיות של ההודעות "notice" ו־"alert" בתוך תג ה-body, ישירות מעל <%= yield %>:

app/views/layouts/application.html.erb
...
<body>
  <p class="notice"><%= notice %></p> 
  <p class="alert"><%= alert %></p> 
  <%= yield %>
</body>

כשהתצוגה נטענת בדפדפן, התג <%= yield %> block יוחלף בתוכן מקובץ התצוגה שלך. בקובץ התצוגה שלך, היה לך רק תג p. תג זה יוחלף בתוכן מהתצוגה שלך.

שמור וסגור את הקובץ.

בשלב זה, התקנת והגדרת Devise בפרויקט שלך. בשלב הבא, תיצור את מודל המשתמש שלך עבור היישום עם Devise ותגדיר אימות משתמש.

שלב 4 — יצירת מודל המשתמש עם Devise

אתה כעת מוכן ליצור את מודל המשתמש עם Devise, שיצור את קובץ המודל הנדרש ויבצע מיגרציה שתוכל להפעיל כדי ליצור טבלת users ביישום שלך. כל פעם שמישהו נרשם, יהיה עליך ליצור רשומה חדשה בטבלת users במסד הנתונים. בעזרת מודל המשתמש, תוכל לשנות רשומות אלו מתוך תצוגה חזית.

בשלב זה, תיצור מודל משתמש, תבדוק את התצורה ברירת המחדל, ואז תפעיל את המיגרציה כדי לעדכן את מסד הנתונים שלך.

מאחר ו-Rails הוא פרימוס-תצוגה-בקר (MVC) framework, לכל טבלה במסד הנתונים יש מחלקה הקשורה אליה, שניתן להשתמש בה לעבוד עם הנתונים בטבלה. במקרה זה, אם תיצור טבלת users, תוכל להשתמש במודל User לביצוע פעולות כמו User.first או User.find_by_email("[email protected]"). תוכל ליצור את המודל הזה על ידי יצירת כיתה רגילה המורכבת מ-ApplicationRecord ב-Rails, אך יצירת מודל משתמש עם Devise נותן לך הרבה מתודולוגיה שאתה יכול להשתמש בה לצורך אימות.

ליצירת משתמש ב-Devise, הפעל את הפקודה הבאה של היצירה:

  1. bundle exec rails g devise user

הפלט הבא יודפס למסך:

Output
invoke active_record create db/migrate/20220908152949_devise_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml insert app/models/user.rb route devise_for :users

הפלט מראה ש-Devise יצרה מספר קבצים, יצרה בדיקות, והוסיפה מסלולים. הקובץ הראשון, db/migrate/20220908152949_devise_create_users.rb, הוא קובץ המיגרציה ליצירת טבלת users בבסיס הנתונים שלך. קובץ מיגרציה ב-Rails מתאר את השינויים שיש לבצע בבסיס הנתונים. שם הקובץ של כל מיגרציה יכיל חותמת זמן כדי ש-Rails ידע באיזה סדר לבצע את השינויים.

Devise יצרה גם את קובץ מודל המשתמש (app/models/user.rb), יחד עם בדיקות עבורו. השורה האחרונה בפלט מציינת שנוסף מסלול לקובץ הקיים של config/routes.rb. Devise מוסיפה באופן אוטומטי את כל המסלולים כמו /users/sign_up ו- /users/sign_out באמצעות עזר ה- devise_for :users.

לפני שתריץ את קובץ המיגרציה ותיצור את טבלת users בבסיס הנתונים, בוא נבדוק את הקבצים שנוצרו. זה יעזור לך להבין את ההגדרות שנוצרו על ידי Devise כך שתדע מה קורה כשאתה מפעיל את המיגרציה.

התחל בפתיחת קובץ המיגרציה (db/migrate/20220908152949_devise_create_users.rb) כדי לבדוק את הקוד הברירת מחדל:

db/migrate/20220908152949_devise_create_users.rb
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      ## אימות מסד נתונים
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## החזרת סיסמה
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## זיכור פרטים
      t.datetime :remember_created_at

      ## מעקב
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## אישור דואר אלקטרוני
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # רק אם משתמשים באישור חוזר

Devise כוללת אפשרויות רבות שימושיות, כמו שדות עבור טוקן איפוס הסיסמה והזמן שבו נשלח הטוקן האחרון, וכן הלאה. יש גם שורות לתכונות כמו אימות דואר אלקטרוני, נעילת המשתמש לאחר ניסיונות התחברות נכשלים, ואפילו מעקב אחר פרטי ההתחברות.

מכיוון שאין צורך לבצע שינויים, סגור את קובץ ההעברה.

ייצרו גם את קובץ המודל User. יהיה זמין בתיקיית app/models/.

פתחו את קובץ המודל app/models/user.rb כדי לבדוק את הקוד הבסיסי:

blog/app/models/user.rb
class User < ApplicationRecord
# כלול מודולים ברירת מחדל של Devise. אפשרויות נוספות הן:
# :confirmable, :lockable, :timeoutable, :trackable ו :omniauthable
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable
end

A few options are added by Devise to configure how the user model works. The basic modules (database_authenticatable, registerable, recoverable, rememberable, and validatable) are already included. There are some additional options commented out, corresponding to the extra features you saw in the migration file. You can add these modules to the model file and configure the migration, depending on how much functionality you need in your application.

זה מה שהמודולים הבסיסיים עושים:

  • database_authenticatable: משתמשים יכולים לאמת את עצמם עם שדות כניסה וסיסמה. הסיסמה המוצפנת שלהם תאוחסן בבסיס הנתונים שלך.
  • registerable: משתמשים יכולים להירשם בעצמם ויכולים לערוך או למחוק את החשבונות שלהם.
  • recoverable: משתמשים יכולים לאפס את הסיסמה שלהם ולשחזר את החשבונות שלהם אם הם שכחו את פרטי הכניסה שלהם.
  • rememberable: מודול זה מזכיר לסשנים של משתמש על ידי שמירת המידע בעוגייה שלדפדפן.
  • validatable: מודול זה מספק תיקוני שגיאות עבור שדות האימייל והסיסמה של המשתמש. (לדוגמה, האם היישום שלך מבקש שהסיסמה תהיה לפחות שישה תווים, גם אם לא הגדרת כל תיקוני עבור המודל שלך.)

מודולים אלה כלולים במודל המשתמש שיצרתם כעת. תוכלו למצוא רשימה מלאה של המודולים שמגיעים עם Devise ב- מאגר הקוד של Devise ב- GitHub.

אין צורך לבצע שינויים, אז סגרו את קובץ המודל User.

עדכון נוסף הוא שקובץ config/routes.rb הוחלף כדי להוסיף שורת devise_for עבור users:

Rails.application.routes.draw do
  devise_for :users

  root "home#index"
end

זהו שיטה שימושית שמגדירה את כל הנתיבים הנדרשים הקשורים לאימות משתמש כמו /users/sign_in, /users/sign_out ו-/users/password/new. Devise דואג לכל זה עבורך ואף שומר על קובץ הנתיבים נקי. אם ברצונך להבין כיצד הוספת devise_for :users מתרגמת אוטומטית לכל הנתיבים הללו, תוכל לבדוק את הקוד מקור ב- מאגר הקוד של Devise ב- GitHub.

אין צורך לבצע שינויים כאן, אז סגור את קובץ config/routes.rb.

כדי ללמוד אילו נתיבים מוגדרים באפליקציה שלך, תוכל לרשום אותם באמצעות הפקודה הבאה:

  1. bundle exec rails routes

הפקודה הזו מדפיסה את כל נתיבי האפליקציה ואת הבקרים שלהם. במקרה של אימות, כל הנתיבים הללו נוצרו על ידי Devise, ולא היית צריך להוסיף אותם באופן ידני.

הפלט יהיה ארוך, אך הנה קטע מספק מהנתיבים:

Prefix Verb URI Pattern Controller#Action
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
user_password PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
POST /users/password(.:format) devise/passwords#create
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel

הנתיבים הרשומים בפלט הם הנתיבים שנוספו על ידי Devise כאשר כלולת את השורה devise_for :users בקובץ הנתיבים שלך. אלה הם הנתיבים לפעולות כמו התחברות, הרשמה, איפוס סיסמה וכו'.

עכשיו שביקשת לבחון את הקבצים והתצורה שנוצרה על ידי Devise, תוכל להריץ את ההעברה שיצרת בתחילת שלב זה עם הפקודה הבאה:

  1. bundle exec rails db:migrate

הפקודה לעיל תבצע את כל השינויים בכל אחד מקבצי ההעברה שלך למסד הנתונים. השינויים צריכים להתבצע אחרי אחד, בדיוק כפי שהם מוגדרים בקבצים. Rails צריך לדעת את הרצף בו יש להריץ את ההעברות, ולכן הקבצים נוצרים עם חותמות זמן בשמותיהם.

הפלט דומה לזה שלמטה יודפס למסך:

Output
== 20220908152949 DeviseCreateUsers: migrating ================================ -- create_table(:users) -> 0.0040s - add_index(:users, :email, {:unique=>true}) -> 0.0012s - add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0011s == 20220908152949 DeviseCreateUsers: migrated (0.0074s) =======================

כאשר ההעברה תושלם, מסד הנתונים שלך יוכנס למצבו. עשית את כל מה שנדרש כדי להגדיר אימות משתמש בפרויקט שלך.

בנקודה זו, אנא הפעל מחדש את שרת ה-Rails שלך:

  1. bundle exec rails server

קובץ האיניציאליזציה שצוין למעלה נטען רק כאשר Rails מאתחל. עליך לאתחל את השרת כך ש-Rails יוכל לטעון את קובץ האיניציאליזציה החדש של Devise ולהגדיר הכל כך שאימות המשתמש יעבוד.

עבור ל־http://localhost:3000/users/sign_up בדפדפן שלך, ושם תמצא טופס הרשמה ליצירת חשבון על ידי הזנת כתובת דוא"ל וסיסמה. (בשלב הבא, תוסיף כפתורים להרשמה ולהתחברות לדף הנחיתה כך שיהיה קל לקורא לנווט לכתובת ה-URL הזו.)

כדי לבדוק את האימות, הזן כתובת דוא"ל ניסיונית כמו [email protected] וסיסמה.

פעם אחת שתירשם, תועבר לדף הבית, שמציג את שלום DigitalOcean! יחד עם הודעה האומרת שנרשמת בהצלחה, כמו כן:

הודעת ההצלחה בהרשמה הזו מוצגת בתוך התגית <p class="notice"><%= notice %></p> שהוספת לקובץ application.html.erb.

בנקודה זו, הגדרת אימות משתמש עם Devise בפרויקט שלך ונרשמת באמצעות חשבון דוגמא. הגדרת את Devise כך שיתאים לצרכי היישום שלך, ובעקבות זאת, Devise יצר את הנתיבים, התצוגות והבקרים שמקלים על תהליך ההרשמה של המשתמש.

עכשיו שאימתת שתהליך ההרשמה עובד כצפוי, השלב הבא הוא להוסיף אימות זה לעמוד הנחיתה שיצרת ב- שלב 2. בשלב הבא, תקשר את עמוד ההרשמה לעמוד הנחיתה כך שהמשתמשים לא יצטרכו לנווט ל-URL ספציפי כדי להירשם, כמו שעשית כאן.

שלב 5 — קישור האימות לעמוד הנחיתה

יש לך את כל הפונקציות המוגדרות בפרויקט שלך, אך עדיין עליך לחבר את דפי ה-Devise שנוצרו עם דף הנחיתה שלך. בשלב הקודם, ביקרת ידנית בדף /users/sign_up כדי להיכנס. בשלב זה, תקשור את כל הדפים יחד על ידי הוספת הקישורים הדרושים לדף הנחיתה שלך. תציג קישורים להתחברות או התנתקות מהאפליקציה בהתאם למעמדם של המשתמשים.

תוכל לבצע זאת באמצעות מספר פעוט של מתודות עזר מה-Devise. ה-Gem של Devise מגיע עם הרבה מתודות עזר שאפשר להשתמש בהם מבלי לצטרך לממש הכל בעצמך. זה יקל על הקריאה ועל התחזוקה של הקוד.

תתחיל בהוספת קוד לבדיקה אם המשתמש מחובר. אם כן, דף הנחיתה יציג את כתובת האימייל שלהם וקישור להתנתקות מהאפליקציה. אם המשתמש לא מחובר, דף הנחיתה יציג קישור לעבור לדף ההתחברות.

פתח את הקובץ app/views/home/index.html.erb לעריכה והוסף את השורות המודגשות:

app/views/home/index.html.erb
<% if user_signed_in? %> 
 <div> Welcome <%= current_user.email %> </div> 
  <%= button_to "Sign out", destroy_user_session_path, method: :delete %> 
<% else %>
  <%= button_to "Sign in", new_user_session_path %> 
<% end %>
<h1>Hello DigitalOcean!</h1>

user_signed_in? מגיע ממתודות העזר הקשורות לבקרות של Devise. הוא בודק אם המשתמש מחובר או לא ומחזיר ערך בוליאני true או false. אתה יכול להשתמש בתוצאה הזו לתכנות פונקציות נוספות באפליקציה שלך, כמו להציג את מידע חשבונם של המשתמשים אם הם מחוברים. למידע נוסף על מתודת העזר הזו, תוכל לבדוק את קוד המקור במאגר GitHub של Devise.

current_user הוא עוזר של Devise שמגיש את פרטי המשתמש שנכנס כעת ליישום. לדוגמה, אם תתחבר עם [email protected], העוזר current_user יחזיר את מודל המשתמש עבור [email protected]. לכן, בשימוש ב־current_user.email, תקבל [email protected] כתוצאה. על ידי שימוש ב־Devise, אתה ממנע מעצמך לבצע את הלוגיקה הזו מהתחלה, חוסך לך זמן ומאמץ.

לבסוף, עם קטע הקוד הזה, הוספת כניסה ו־יציאה לכפתורים לדף הנחיתה. בהתאם לתוצאת השיטת עוזר user_signed_in?, תציג אפשרות להיכנס או להתנתק באמצעות הכפתורים כניסה ו־יציאה שהתווספו לאחרונה.

אתה משתמש בשיטת button_to כדי להגדיר כפתור שמביא את המשתמש לנתיב מסוים. גם אתה משתמש בשיטות עוזר כדי לקבל את הנתיבים הללו: destroy_user_session_path מקבל את /users/sign_out ו־new_user_session_path מקבל את /users/sign_in. (ניתן לראות את רשימת העוזרים המלאה של כתובות ה־URL של הנתיבים על ידי הרצת bundle exec rails routes, כפי שנאמר בשלב קודם.)

שמור וסגור את הקובץ.

רענן את העמוד בדפדפן כדי לראות את השינויים.

אם עדיין לא ניסית להירשם לאפליקציה שלך, תוכל לבקר בנתיב /users/sign_in על ידי לחיצה על הכפתור התחבר בדף שלך. מכאן, תוכל להמשיך וליצור חשבון חדש על ידי לחיצה על הקישור הרשם בתחתית. הזן אימייל לדוגמה כמו [email protected] וסיסמה. לאחר שתרשום, תועבר שוב לעמוד הנחיתה. כעת, עמוד הנחיתה מציג את כתובת האימייל של המשתמש המחובר כרגע, יחד עם כפתור התנתק, כפי שמוצג כאן:

. תקבל גם הודעה שאומרת, נרשמת בהצלחה.

ועם זאת, התקנת בהצלחה את ג'ם Devise והגדרת אימות משתמש באפליקציה שלך.

סיכום

במדריך זה, השתמשת ב-Devise כדי להוסיף אימות משתמש לאפליקציה של Rails. באמצעות מתודות העזר של Devise, יצרת אפליקציה שבה משתמשים יכולים ליצור חשבונות, להירשם ולהתנתק.

כדי להבין טוב יותר את Devise ואת המתודות והעזרים הנוספים, כדאי לבדוק את קובץ ה-README במאגר ה-GitHub של Devise. כשלב הבא במדריך זה, תוכל לנסות להציג את הברכה "שלום עולם!" בעמוד באופן תנאי עם משהו כמו שלום שם משתמש בהתאם לכך אם המשתמש מחובר או לא.

ניתן למצוא את הקוד עבור פרוייקט זה ב־מאגר ה־GitHub של קהילת DigitalOcean.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-user-authentication-with-devise-in-a-rails-7-application