导轨密码验证
问题描述:
首先,我非常非常新的导轨。所以忍受我的任何错误。仍在努力寻找可靠信息的最佳来源。很多事情都有点过时了。导轨密码验证
我在跟踪Rails tutorial并使用密码验证。在我的应用程序中,我有通过它们之间的关系的用户和具有has_many的部门。这种关系被称为管理者关系。我的用户验证和授权工作。管理和取消管理按钮用于创建经理关系。我还使用安全密码设置了每个部门。我希望在创建经理关系之前要求用户输入部门的密码。我在管理按钮旁边添加了一个密码字段。
型号:
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
############################################################
答
我添加的代码是正确的。问题出在我尝试在无效密码后显示的闪光消息。
if authenticate
else
flash.now[:error] = 'Invalid password'
render 'new' <<I removed this line.>>
end
我的代码试图呈现manager_relationships/new,但它不在那里。我删除这个按钮后,按计划工作。但闪光消息不会显示出来。我在另一个问题上发布了这个问题,因为这是另一个话题。
答
理想的情况下,因为用户登录不需要密码,用户如何来您的网页。 可能是你想要保护设置/取消数据的另一个层面,你可以使用
@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
一个快速的问题是你正在使用会话变量加载当前用户吗? – Amar 2013-03-23 17:59:51
管理员关系控制器上实际上有一个过滤器,需要用户在创建或销毁管理者关系之前登录。 – doubleA 2013-03-23 18:01:40
so current_user存在吗?所以每个manager_relationships行都有密码字段?你想添加一些密码到manager_relationships表是你想要的吗? – Amar 2013-03-23 18:05:30