2013-03-23 6 views
2

Сначала я очень новичок в рельсах. так что несут с собой какие-либо ошибки моего нуба. Все еще пытаюсь найти лучшие источники для надежной информации. Многие вещи немного устарели.рельсы аутентификация пароля

Я следил за Rails tutorial и работал с аутентификацией пароля. В моем приложении у меня есть пользователи и отделы с has_many через отношения между ними. Отношения называются manager_relationship. Мое удостоверение подлинности и авторизация для пользователей работают. Кнопка управления и неуправляемости работает для создания отношений с менеджером. Я также создал каждый отдел с безопасным паролем. Я надеялся потребовать от пользователя ввода пароля для отдела, прежде чем отношения менеджера могут быть созданы. Я добавил поле пароля рядом с кнопкой управления.

Модели:

department.rb 
class Department < ActiveRecord::Base 
attr_accessible :department_name, :password, :password_confirmation 
has_many :manager_relationships, dependent: :destroy 
has_many :users, through: :manager_relationships 
has_secure_password 

manager_relationship.rb

class ManagerRelationship < ActiveRecord::Base 
attr_accessible :department_id 

belongs_to :user 
belongs_to :department 

validates :user_id, presence: true 
validates :department_id, presence: true 
end 

user.rb

class User < ActiveRecord::Base 
attr_accessible :name, :email, :password, :password_confirmation 
has_many :manager_relationships, dependent: :destroy 
has_many :departments, through: :manager_relationships 
has_secure_password 

Просмотров отдел/show.html.erb

... 
<div class="span8"> 
    <%= render 'manage_form' if signed_in? %> 
</div> 
</div> 

departmnet/_manage.html.erb

<%= form_for(current_user.manager_relationships.build(department_id: @department.id), remote: true) do |f| %> 
<div><%= f.hidden_field :bdepartment_id %></div> 
<%= f.submit "Manage Department", class: "btn btn-large btn-primary" %> 
<% end %> 

Контроллер: ManagerRelationshipsController

class ManagerRelationshipsController < ApplicationController 
before_filter :signed_in_user 

def create 
    @department = Department.find(params[:manager_relationship][:department_id]) 

    current_user.manage!(@department) 
    respond_to do |format| 
     format.html { redirect_to @department } 
     format.js 
    end 
end 

Приведенный выше код работает. Он успешно создает и уничтожает отношения менеджера. Но аутентификации нет. Любой пользователь может управлять любым отделом. Я хотел бы потребовать, чтобы управляющий пользователь вводил пароль отдела для создания manager_relationship.

Вот что я пробовал.

departmnet/_manage.html.erb

<%= form_for(current_user.manager_relationships.build(department_id: @department.id), 
remote: true) do |f| %> 
##################This Was Added ############## 
<div> 
<%= f.label :password %> 
<%= f.password_field :password %> 
</div> 
################################################ 

<div><%= f.hidden_field :department_id %></div> 
<%= f.submit "Manage Department", class: "btn btn-large btn-primary" %> 
<% end %> 

ManagerRelationshipsController

class ManagerRelationshipsController < ApplicationController 
before_filter :signed_in_user 
def create 
    @department = Department.find(params[:manager_relationship][:department_id]) 
      ########################The line below was Added ########################## 
    if @department.authenticate(params[:manager_relationship][:password]) 
      ########################################################################### 
     current_user.manage!(@department) 
    respond_to do |format| 
     format.html { redirect_to @department } 
     format.js 
    end 
     ####################I added this################## 
    else 
     flash.now[:error] = 'Invalid password' 
     render 'new' 
    end 
     ############################################################ 
+0

Один быстрый вопрос: вы загружаете текущего пользователя с использованием переменной сеанса? – Amar

+0

на самом деле есть фильтр перед контроллером, который требует, чтобы пользователь выполнил вход, прежде чем они смогут создать или уничтожить отношения менеджера. – doubleA

+0

так что current_user присутствует? поэтому каждая строка manager_relationships имеет поле пароля? вы хотите добавить пароль в таблицу manager_relationships, что вы хотите? – Amar

ответ

0

Код, который я добавил правильно. Проблема заключалась в сообщении флэш-памяти, которое я пытался отобразить после недопустимого пароля.

if authenticate 
else 
flash.now[:error] = 'Invalid password' 
render 'new' <<I removed this line.>> 
end 

Мой код пытался визуализировать manager_relationships/new, но его там не было. После того, как я удалил это, кнопка работала так, как планировалось. Но флеш-сообщения не будут отображаться. Я разместил это в другом вопросе, потому что это еще одна тема.

0

В идеале, так как пользователь Войти вам не нужен пароль, как пользователь может прийти на вашу страницу. Может быть, вы хотите еще один уровень защиты для включения/отключения данных вы можете использовать

@user = User.where(:email=>...).first 
# Authenticating User sonce your email id is in session 
# You don't need to store password on manager_relationship 
# create attr_accessor 
@user.authenticate(params[:manager_relationship][:password]) 
# if user is authenticate then you can add/edit your data 
+0

Спасибо за вашу помощь. либо я не понимаю ваш ответ, либо вы не понимаете, что я пытаюсь сделать. Предположим, что модели Manager_relationship нет. Я также все еще смущен тем, откуда исходят параметры. params [: manager_relationship] [: password] << что это точно? – doubleA

+0

У меня должно быть 2 пароля. один для входа в систему. и один для создания отношений с менеджером. Я не хочу, чтобы любой пользователь мог управлять отделом. Для управления отделом пользователю нужен пароль администратора. – doubleA

Смежные вопросы