Dans certains de mes articles précédents sur le téléchargement d'images dans Rails, j'ai mentionné Devise mais je n'y suis pas allé profondément. Dans ce tutoriel, je vais vous apprendre sur Devise.
Prêt? Commençons!
Devise est une solution d'authentification pour Rails construite avec Warden et fournie par les gens formidables de Plataformatec. Devise fournit différents modules:
Dans le cadre de ce didacticiel, nous allons générer une application Rails que nous utiliserons pour vérifier le fonctionnement de Devise. Continuons!
rails nouvelle devise-app -T
le -T
flag indique à Rails de générer l’application sans la suite de tests par défaut. Accédez au répertoire de votre application et déposez les gemmes suivantes dans votre Gemfile
.
#Gemfile gem 'devise', '~> 4.1' gem 'bootstrap-sass', '~> 3.3'
Maintenant, installez les gemmes Devise et Bootstrap que vous venez d'ajouter.
installation groupée
Renommez votre app / assets / stylesheets / application.css
déposer dans app / assets / stylesheets / application.scss
et ajoutez les lignes suivantes:
# app / assets / stylesheets / application.scss @import "bootstrap-sprockets"; @import "bootstrap";
Ouvrez le app / assets / javascripts / application.js
déposer et exiger bootstrap-pignons
. Le mien ressemble à ceci:
# app / assets / javascripts / application.js // = nécessite jquery // = requiert bootstrap-sprockets // = requiert jquery_ujs // = nécessite turbolinks // = require_tree .
Ensuite, vous devez exécuter la commande Rails pour installer les fichiers de configuration de Devise. Vous le faites en lançant cette commande:
les rails génèrent un montage: installer
La commande génère ce qui suit sur votre terminal. Vous devriez le lire pour comprendre ce qui s'est passé.
créer config / initialiseurs / devise.rb créer config / locales / devise.en.yml =============================== ============================================ Certains vous installent Vous devez le faire manuellement si vous ne l'avez pas encore fait: 1. Assurez-vous d'avoir défini les options d'URL par défaut dans vos fichiers d'environnement. Voici un exemple de default_url_options approprié pour un environnement de développement dans config / environment / development.rb: config.action_mailer.default_url_options = hôte: 'localhost', port: 3000 En production,: hôte doit être défini sur l'hôte réel de ton application. 2. Assurez-vous d'avoir défini root_url sur * quelque chose * dans votre config / routes.rb. Par exemple: root to: "home # index" 3. Assurez-vous que les messages flash sont dans app / views / layouts / application.html.erb. Par exemple:<%= notice %>
<%= alert %>
4. Si vous déployez uniquement sur Heroku avec Rails 3.2, vous voudrez peut-être définir: config.assets.initialize_on_precompile = false Sous config / application.rb, forçant votre application à ne pas accéder à la base de données ou à charger des modèles lors de la précompilation de vos actifs. 5. Vous pouvez copier des vues Devise (pour personnalisation) sur votre application en exécutant: rails g legs: views =========================== =============================================== =
La commande génère également deux fichiers, que vous pouvez trouver dans config
annuaire. Il nous donne également des instructions sur ce que nous devrions faire..
Accédez à la présentation de votre application, app / views / layouts / application.html.erb
, et le faire ressembler à ce que j'ai ci-dessous:
# app / views / layouts / application.html.erbDeviseApp <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => vrai%> <%= javascript_include_tag 'application', 'data-turbolinks-track' => vrai%> <%= csrf_meta_tags %><%= notice %>
<%= alert %>
<%= yield %>
Vous devez définir les options d'URL par défaut pour votre environnement de développement. Ajoutez le code ci-dessous dans config / environnements / développement.rb
.
# config / environment / development.rb config.action_mailer.default_url_options = hôte: 'localhost', port: 3000
Maintenant, vous devez créer un Utilisateur
modèle pour Devise. Vous pouvez le faire en utilisant votre terminal.
les rails génèrent un utilisateur
Cela va générer un user.rb
déposer dans votre app / modèles
annuaire. Le fichier généré ressemblera à ceci:
classe utilisateur < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable end
Vous pouvez voir qu'il contient les modules par défaut que j'ai mentionnés ci-dessus. La commande que vous avez exécutée a également modifié votre config / routes.rb
fichier en ajoutant une route pour carte. Tu devrais vérifier ça.
À ce stade, vous devez migrer votre base de données. Vous le faites en exécutant:
rake db: migrer
Maintenant, vous devez créer un PagesController
et envelopper l'authentification Devise autour de cela, cela empêchera les personnes non autorisées de voir la page.
rails générer contrôleur Pages index
Ouvrez votre fichier de routes et définissez la racine de votre application.
# config / routes.rb Rails.application.routes.draw do devise_for: utilisateurs root à: "pages # index" fin
Ouvrez votre PagesController
et ajouter une authentification pour votre indice
et Nouveau
des pages.
# app / controllers / pages_controller.rb class PagesController < ApplicationController before_action :authenticate_user!, only: [:index, :new] def index end def new end end
Le code montre que le indice
et Nouveau
les pages ne sont accessibles qu'aux utilisateurs enregistrés. Ouvrez votre terminal et démarrez votre serveur de rails
. Pointez votre navigateur sur http: // localhost: 3000
et vous serez automatiquement redirigé vers la page de connexion à Devise.
Le moyen par défaut de se connecter à Devise implique l’utilisation d’une adresse électronique et d’un mot de passe. Que faire si vous voulez permettre aux utilisateurs de se connecter avec leur nom d'utilisateur unique? Si c'est ce que vous voulez, c'est possible. Voyons comment.
Exécutez la commande:
rails générer la migration AddUsernameToUSer nom d'utilisateur: string
Cela va ajouter une nouvelle colonne pour Nom d'utilisateur
dans ton utilisateurs
table. Migrer votre base de données.
rake db: migrer
Vous devez ajouter à vos vues un champ dans lequel vos utilisateurs peuvent entrer leur nom d'utilisateur. Quand vous allez à votre app / vues
répertoire, vous ne trouverez aucun fichier rendant les vues Devise. En effet, Devise charge les vues à partir de son gemset. Pour le personnaliser, vous devez générer des copies des vues. La commande ci-dessous fait la magie.
les rails génèrent des vues: vues
Cela générera des dossiers et des fichiers dans votre app / vues
annuaire.
Vous devrez modifier la page pour vous connecter, vous connecter et mettre à jour les informations utilisateur. Il suffit de coller les blocs de code ci-dessous dans leurs fichiers respectifs.
# app / views / inventer / registrations / new.html.erbS'inscrire
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= devise_error_messages! %><%= f.label :email %>
<%= f.email_field :email, autofocus: true, class: "form-control" %><%= f.label :username %> <%= f.text_field :username, class: "form-control" %><%= f.label :password %> <% if @minimum_password_length %> (<%= @minimum_password_length %> caractères minimum) <% end %>
<%= f.password_field :password, autocomplete: "off", class: "form-control" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %><%= f.submit "Sign up", class: "btn btn-primary" %><% end %> <%= render "devise/shared/links" %>
# app / views / inventer / registrations / edit.html.erbmodifier <%= resource_name.to_s.humanize %>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: method: :put ) do |f| %> <%= devise_error_messages! %><%= f.label :email %><% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<%= f.email_field :email, autofocus: true, class: "form-control" %>En attente de confirmation pour: <%= resource.unconfirmed_email %><% end %><%= f.label :username %> <%= f.text_field :username, class: "form-control" %><%= f.label :password %> (laissez vide si vous ne voulez pas le changer)
<%= f.password_field :password, autocomplete: "off", class: "form-control" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %><%= f.label :current_password %> (nous avons besoin de votre mot de passe actuel pour confirmer vos modifications)
<%= f.password_field :current_password, autocomplete: "off", class: "form-control" %><%= f.submit "Update", class: "btn btn-primary" %><% end %>Annuler mon compte
Malheureux? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>
<%= link_to "Back", :back %>
# app / views / devise / sessions / new.html.erbS'identifier
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %><%= f.label :username %>
<%= f.text_field :username, autofocus: true, class: "form-control" %><%= f.label :password %><% if devise_mapping.rememberable? -%>
<%= f.password_field :password, autocomplete: "off", class: "form-control" %><%= f.check_box :remember_me %> <%= f.label :remember_me %><% end -%><%= f.submit "Log in", class: "btn btn-primary" %><% end %> <%= render "devise/shared/links" %>
À l'aide de votre éditeur de texte, naviguez jusqu'à app / controllers / application_controller.rb
. Vous devez le modifier pour permettre l'utilisation du nom d'utilisateur. Modifiez-le pour qu'il ressemble à ceci:
classe # app / controllers / application_controller.rb ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters added_attrs = [:username, :email, :password, :password_confirmation, :remember_me] devise_parameter_sanitizer.permit :sign_up, keys: added_attrs devise_parameter_sanitizer.permit :account_update, keys: added_attrs end end
Désormais, un utilisateur peut se connecter avec son nom d'utilisateur. À ce stade, quelque chose ne va pas dans votre demande. Lorsqu'un utilisateur se connecte, il n'y a aucun moyen de se déconnecter. Cela n'entraîne pas une expérience utilisateur exceptionnelle. Je vais vous montrer comment résoudre ce problème.
A partir de votre terminal, créez un nouveau répertoire appelé partagé
dans ton app / vues
dossier.
mkdir app / views / shared app tactile / views / shared / _navigation.html.erb
Le fichier que vous avez créé ci-dessus est un partiel où le code de votre barre de navigation sera écrit. Déposer dans le code suivant.
# app / views / shared / _navigation.html.erb
Vous devez maintenant rendre la barre de navigation dans la présentation de votre application. S'ouvrir app / views / layouts / application.html.erb
et déposez le code pour rendre votre barre de navigation.
# app / views / layouts / application.html.erb…<%= render "shared/navigation" %>…<%= notice %>
<%= alert %>
Dans cette partie, vous avez appris à installer Devise et à ajouter une authentification à vos pages. J'ai aussi mentionné un partiel. Je vais couvrir cela dans un tutoriel séparé.
Dans la prochaine partie, nous aborderons certains domaines plus avancés que cela. J'espère que cela valait la peine!