2013-04-07 22 views
6

Tôi đang phát triển ứng dụng bằng Rails và Devise để xác thực của người dùng. Tôi tự hỏi nếu có một cách để yêu cầu mật khẩu chỉ cho một số thay đổi.Thiết lập: chỉ yêu cầu mật khẩu cho các tình huống nhất định

Ví dụ, tôi muốn các mật khẩu để được yêu cầu khi:

  • Xóa tài khoản
  • Thay đổi mật khẩu

Và tôi muốn người dùng được tự do chỉnh sửa các lĩnh vực khác mà không bất kỳ mật khẩu nào, chẳng hạn như:

  • Tên
  • Tên đăng nhập
  • Avatar

Vì vậy, tôi muốn một cách để trao đổi giữa hai phương pháp này. Làm sao tôi có thể giải quyết việc này?

EDIT:

Trong tài liệu hướng dẫn lập mưu của Tôi thấy điều này và nó hoạt động tốt, nó chỉ cho phép thay đổi mật khẩu và email nếu tôi nhập mật khẩu:

def update 
    @user = User.find(current_user.id) 

    successfully_updated = if needs_password?(@user, params) 
     @user.update_with_password(params[:user]) 
    else 
     # remove the virtual current_password attribute update_without_password 
     # doesn't know how to ignore it 
     params[:user].delete(:current_password) 
     @user.update_without_password(params[:user]) 
    end 

    if successfully_updated 
     set_flash_message :notice, :updated 
     # Sign in the user bypassing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to after_update_path_for(@user) 
    else 
     render "edit" 
    end 

end 

private 

# check if we need password to update user data 
# ie if password or email was changed 
# extend this as needed 
def needs_password?(user, params) 
    user.email != params[:user][:email] || 
    !params[:user][:password].blank? 
    #HERE 
end 

Bây giờ, những gì tôi có thể đưa vào #HERE để cũng yêu cầu mật khẩu khi tôi xóa tài khoản?

+0

bạn không thể thêm bất cứ thứ gì '# HERE' vì phương thức' update' không xóa người dùng, nó chỉ cập nhật thuộc tính người dùng. Bạn có thể muốn thêm cùng một loại công cụ vào phương thức 'hủy' trong bộ điều khiển – ted

Trả lời

0

Bạn có thể tạo một form_tag chuyển hướng đến một hành động trong bộ điều khiển của bạn.

<%= form_tag url_for(:controller => :users, :action => :destroy), :method => :get do %> 
    <%= label_tag(:password, "Enter password before deleting") %> 
    <%= password_field_tag :password %> 
    <%= submit_tag "Delete User With Confirmation" %> 
<% end %> 

Các hành động trong UsersController của bạn sẽ là một cái gì đó như:

def destroy 
    if current_user.authenticate(params[:password]) 
     #do something 
    else 
     #do something 
    end 
end 
3

do cho câu hỏi chỉnh sửa:

def destroy 
    if current_user.valid_password?(params[:user][:password]) 
    current_user.destroy 
    else 
    render "destroy" # or what ever 
    end 
end 
+0

của bạn mà không yêu cầu mật khẩu, phải không? – Zippie

+0

@Zippie, "Phương pháp này đảm bảo rằng người dùng đã đăng nhập và nếu không chuyển hướng họ đến trang đăng nhập", nguồn: http://asciicasts.com/episodes/210-customizing-devise – ted

+0

Fran đã đăng: "Tôi tự hỏi nếu có một cách để hỏi mật khẩu chỉ cho một số thay đổi. " – Zippie

0

Có một phương pháp destroy_with_password trong lập mưu (ít nhất kể từ phiên bản 3.5. 2). Đó là trong lib/devise/models/database_authenticatable.rb và được gọi bằng

destroy_with_password(current_password) 

nó phá hủy các hồ sơ nếu current_password phù hợp, và trả về false.

Các vấn đề liên quan