Autorizare cu autorul

Pundit este un instrument care vă permite să restricționați anumite părți ale aplicației Rails utilizatorilor autorizați. Aceasta face acest lucru prin a vă oferi anumite ajutoare.

În acest tutorial, veți crea un blog care restricționează anumite părți, cum ar fi crearea, actualizarea și ștergerea articolelor numai pentru utilizatorii autorizați.

Noțiuni de bază

Începeți prin generarea unei noi aplicații Rails.

șine noi pundit-blog -T

-T steagul spune Rails să genereze noua aplicație fără suita de test implicită. Rularea comenzii va genera aplicația Rails și va instala pietrele implicite.

Mergeți mai departe și adăugați următoarele pietre în fișierul Gem. Veți utiliza bootstrap-sass pentru aspectul aplicației dvs. și Devise va gestiona autentificarea utilizatorului.

# Gemfile ... bijuterie "bootstrap-sass" bijuterie "concepe"

Rulați comanda pentru a instala gemul.

instalare pachet

Acum redenumiți app / active / stylesheets / application.css la app / active / stylesheets / application.scss. Adăugați următoarele linii de cod pentru a importa bootstrap.

# app / assets / stylesheets / application.scss ... @import 'bootstrap-sprockets'; @import 'bootstrap';

Creați un nume parțial _navigation.html.erb să țineți codul dvs. de navigare; partiala ar trebui sa fie localizata in app / views / dispuneri director. Faceți aspectul parțial cu ceea ce am mai jos.

# App / opinii / machete / _navigation.html.erb 

Pentru ca navigația să fie utilizată, trebuie să o redați în aspectul aplicației. Ajustați aspectul aplicației dvs. pentru a arăta cum am spus mai jos.

# App / opinii / machete / application.html.erb    Pundit-blog <%= csrf_meta_tags %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>   <%= render "layouts/navigation" %> 
<% flash.each do |key, value| %>
<%= value %>
<% end %>
<%= yield %>

Generați modelul de utilizator

Rulați comanda pentru a instala Devise.

șinele generează:

Acum, generați modelul de utilizator.

șinele generează un utilizator

Migrează baza de date.

rake db: migrați

Generați resursele articolului

Rulați comanda pentru a genera resursele articolului.

șinele generează schele Titluri articole: corpul șirului: text

Aceasta vă va genera ArticlesController și modelul articolului. De asemenea, va genera viziunile necesare.

Acum migrați baza de date rulând:

rake db: migrați

Deschide app / opinii / articole / _form.html.erb și să o arate ca la ce am mai jos.

# App / opinii / articole / _form.html.erb <%= form_for(article) do |f| %> <% if article.errors.any? %> 

<%= pluralize(article.errors.count, "error") %> a interzis salvarea acestui articol:

    <% article.errors.full_messages.each do |message| %>
  • <%= message %>
  • <% end %>
<% end %>
<%= f.label :title %> <%= f.text_field :title %>
<%= f.label :body %> <%= f.text_area :body %>
<%= f.submit %>
<% end %>

Pentru tine fișier index, ar trebui să arate așa.

# App / opinii / articole / index.html.erb  <% @articles.each do |article| %>  <% end %> 
Titlu Corp
<%= article.title %> <%= article.body %> <%= link_to 'Show', article %> <%= link_to 'Edit', edit_article_path(article) %> <%= link_to 'Destroy', article, method: :delete, data: confirm: 'Are you sure?' %>

<%= link_to 'New article', new_article_path %>

Codul de mai sus aranjează articolele de pe pagina de index într-un format de tabel pentru a face să pară prezentabil.

Deschideți fișierul rutelor și adăugați ruta pentru resursele articolelor.

# config / routes.rb ... resurse: articole rădăcină la: "articole # index"

Integrați Pundit

Adăugați bijuteria Pundit în fișierul Gem.

# Gemfile ... bijuterie "pundit"

Rulați comanda pentru a instala.

instalare pachet

Integrați Pundit în aplicația dvs. adăugând următoarea linie la dvs. ApplicationController.

# app / controllers / application_controller.rb ... include Pundit ... 

Pornește generatorul lui Pundit.

rails g pundit: instalare

Acest lucru va genera un dosar de aplicații / politici care conține o clasă de bază cu politici. Fiecare politică este o clasă Ruby de bază.

Acesta este modul în care arată politica clasei de bază.

# app / policies / application_policy.rb clasă ApplicationPolicy attr_reader: utilizator,: record def initialize (utilizator, înregistrare) @user = user @record = înregistrare fin index def? sfarsit def defal? scope.where (: id => record.id) .există? sfarsit def crea? sfarsit nou def? crea? end update update? Definiții false fin def? Actualizați? end def distruge? (user, scope.class) domeniul de clasă Domeniul de aplicare attr_reader: user,: scope def initialize (utilizator, domeniul de aplicare) @user = user @scope = domeniul de aplicare final def rezolva sfârsitul scopului end end

Creați politica de articole

Acum trebuie să vă scrieți propria politică. Pentru acest tutorial, doriți să permiteți numai utilizatorilor înregistrați să creeze articole noi. În plus, numai creatorii unui articol ar trebui să poată edita și șterge articolul.

Pentru a realiza acest lucru, politica dvs. privind articolele va arăta astfel.

# app / policies / article_policy.rb clasă ArticlePolicy < ApplicationPolicy def index? true end def create? user.present? end def update? return true if user.present? && user == article.user end def destroy? return true if user.present? && user == article.user end private def article record end end

În cele de mai sus, permiteți tuturor (utilizatorii înregistrați și neînregistrați) să vadă pagina index. Pentru a crea un articol nou, trebuie înregistrat un utilizator. Să utilizați user.present? pentru a afla dacă utilizatorul care încearcă să efectueze acțiunea este înregistrat.

Pentru actualizarea și ștergerea, doriți să vă asigurați că numai utilizatorul care a creat articolul este capabil să efectueze aceste acțiuni.

În acest moment, trebuie să stabiliți o relație între modelul dvs. de articol și cel al utilizatorului.

Faceți acest lucru generând o nouă migrare.

șinele generează migrarea add_user_id_to_articles utilizator: referințe

Apoi, migrați baza de date prin executarea comenzii:

rake db: migrați

Deschideți modelul Utilizator și adăugați linia care sigilează relația.

# app / models / user.rb ... has_many: articole

Modelul dvs. de articol ar trebui să aibă acest lucru.

# app / models / article.rb ... belongs_to: utilizator

Acum trebuie să vă actualizați ArticlesController așa că este în concordanță cu ceea ce ați făcut până acum.

# app / controllers / articles_controller.rb clasă ArticlesController < ApplicationController before_action :set_article, only: [:show, :edit, :update, :destroy] # GET /articles # GET /articles.json def index @articles = Article.all authorize @articles end # GET /articles/1 # GET /articles/1.json def show end # GET /articles/new def new @article = Article.new authorize @article end # GET /articles/1/edit def edit end # POST /articles # POST /articles.json def create @article = Article.new(article_params) @article.user = current_user authorize @article respond_to do |format| if @article.save format.html  redirect_to @article, notice: 'Article was successfully created.'  format.json  render :show, status: :created, location: @article  else format.html  render :new  format.json  render json: @article.errors, status: :unprocessable_entity  end end end # PATCH/PUT /articles/1 # PATCH/PUT /articles/1.json def update respond_to do |format| if @article.update(article_params) format.html  redirect_to @article, notice: 'Article was successfully updated.'  format.json  render :show, status: :ok, location: @article  else format.html  render :edit  format.json  render json: @article.errors, status: :unprocessable_entity  end end end # DELETE /articles/1 # DELETE /articles/1.json def destroy @article.destroy respond_to do |format| format.html  redirect_to articles_url, notice: 'Article was successfully destroyed.'  format.json  head :no_content  end end private # Use callbacks to share common setup or constraints between actions. def set_article @article = Article.find(params[:id]) authorize @article end # Never trust parameters from the scary internet, only allow the white list through. def article_params params.require(:article).permit(:title, :body, :user_id) end end

În acest moment în aplicația dvs., ați implementat cu succes politicile care restricționează anumite părți ale aplicației dvs. utilizatorilor selectați.

Doriți să adăugați un mesaj de eroare standard care apare ori de câte ori un utilizator neautorizat încearcă să acceseze o pagină restricționată. Pentru a face acest lucru, adăugați următoarele la dvs. ApplicationController.

# app / controllers / application_controller.rb ... rescue_from Pundit :: NotAuthorizedError, cu:: user_not_autorizat privat def user_not_authorized flash [: warning] = "Nu sunteți autorizat să efectuați această acțiune". redirect_to (request.referrer || root_path) sfârșit

Acest cod transformă pur și simplu un text de bază care spune că utilizatorul nu este autorizat să efectueze acțiunea.

Alerga:

$ server de șine

Pentru a porni serverul Rails, îndreptați-vă browserul http: // localhost: 3000 pentru a vedea ce ai.

Concluzie

În acest tutorial, ați învățat cum să lucrați cu Devise și Pundit. Ați putut să creați politici care permit numai utilizatorilor autorizați să vizualizeze anumite părți ale aplicației. Ați creat, de asemenea, un text de eroare de bază care arată când un utilizator neautorizat încearcă să acceseze o parte restricționată a aplicației.

Puteți afla mai multe despre Pundit verificând pagina GitHub.

Cod