我正在使用Devise和Rails 3.
我想调用一个函数,只需验证用户username和密码组合是否正确,而无需实际登录该用户.有没有办法用Devise来完成这样的事情:
User.authenticate(params[:username], params[:password])
Run Code Online (Sandbox Code Playgroud) 有没有办法创造一个after_confirmation :do_something?
目标是在用户确认使用Devise后发送电子邮件:confirmable.
我在我的Rails 3应用程序中使用Tony的教程进行了身份验证
我不希望在我的应用上进行公开注册,只是为了使用管理员帐户创建新用户,但我无法手动创建管理员帐户,因为在表中用户必须生成加密密码和盐,我不知道我知道如何:|
我有一个处理基于断码的用户密码的编辑定制控制器在这里.
用户模型
attr_accessible :password, :password_confirmation, :username, :login
...
devise :database_authenticatable,
:lockable,
:registerable,
:recoverable,
:rememberable,
:trackable
Run Code Online (Sandbox Code Playgroud)
PasswordsController
expose(:user) { current_user }
def update
if user.update_with_password(params[:user])
sign_in(user, :bypass => true)
flash[:notice] = "success"
else
render :edit
end
end
Run Code Online (Sandbox Code Playgroud)
我的编辑密码表单位于此处.
问题在于,无论我输入(或不输入该内容)到编辑密码表单中,都会显示"成功"闪存方法.
我在我的网站中使用Devise我创建了管理员命名空间,并通过管理员提供了创建用户的功能.
我的路线如下
devise_for :users,:has_many => :comments, :controllers => {:sessions =>'devise/sessions',:registrations => 'devise/registrations'} do
get "/login", :to => "devise/sessions#new", :as => :login
get "/signup", :to => "devise/registrations#new", :as => :signup
get "/logout", :to => "devise/sessions#destroy", :as => :logout
end
Run Code Online (Sandbox Code Playgroud)
当我点击signup_path导致以下错误的add_user链接时:
我的错误
Started GET "/signup" for 127.0.0.1 at Fri Mar 09 12:49:11 +0530 2012
Processing by Devise::RegistrationsController#new as HTML
User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 35 LIMIT 1
Redirected to http://localhost:3000/admin
Filter chain halted as :require_no_authentication …Run Code Online (Sandbox Code Playgroud) 我正在使用设计并创建了一个名为:active的用户字段,该字段为true或false.在允许用户登录之前,我必须手动使用户处于活动状态(true).至少这是意图.我试过这个......
class SessionsController < Devise::SessionsController
# POST /resource/sign_in
def create
"resource/signin CREATE"
self.resource = warden.authenticate!(auth_options)
unless resource.active?
sign_out
redirect_to :sorry_not_active_url
return
end
set_flash_message(:notice, :signed_in) if is_navigational_format?
sign_in(resource_name, resource)
respond_with resource, :location => after_sign_in_path_for(resource)
end
end
Run Code Online (Sandbox Code Playgroud)
但是,这并没有捕获用户可以登录的所有位置,例如,当用户更改其密码时,该站点会自动将其自动登录.但是,如果用户不活动,我不希望他们被允许登录,而是被重定向到sorry_not_active_url.
如果用户不活动,阻止用户登录的最佳方法是什么?
谢谢.
当我说布局时我并不仅仅意味着视图,我生成那些.在我自己的邮件上,我正在使用默认布局.我在SomeMailer.rb文件中定义
#some_mailer.rb
class SomeMailer < ActionMailer::Base
layout 'sometemplate'
Run Code Online (Sandbox Code Playgroud)
我是否可以通过某种方式为Devise Mailer等人做到这一点?
尝试安装gem设备时出错,安装停止在gem bcrypt-ruby上:
$ gem install bcrypt-ruby
Error installing bcrypt-ruby:
ERROR: Failed to build gem native extension.
Run Code Online (Sandbox Code Playgroud)
我在RVM下使用Ruby运行OSX 10.6.7.我重新安装了最新版本的xcode并重新安装了Ruby 64bit,Rails和所有宝石.
我正在尝试从旧数据库迁移大量用户.为此,我使用activerecord-import并尝试将所有用户数据直接保存到DB(绕过用户模型).
我的问题:我需要使用旧用户的纯文本密码,加密它,并直接存储到数据库.我知道如何使用Devise 生成密码,但我想知道是否有办法获得可以直接存储到数据库的哈希密码.
希望这样做:
new_hashed_password = Devise.awesome_encrypting_method(old_user.password)
Run Code Online (Sandbox Code Playgroud)
然后将"new_hashed_password"直接存储到数据库中,而无需通过模型.我在Devise挖了一遍,发现了这个:
def password_digest(password)
::BCrypt::Password.create("#{password}#{self.class.pepper}", :cost => self.class.stretches).to_s
end
Run Code Online (Sandbox Code Playgroud)
@@ stretches默认为10(lib/devise.rb:71),并且不会被初始化程序覆盖
@@ pepper默认为nil(lib/devise.rb:148),并且不被我的初始化程序覆盖
我以为我可以手动重新创建password_digest(),但我认为我缺少一些关于Bcrypt的基本信息,因为即使设置了密码和延伸,每次产生的哈希都是不同的.
有任何想法吗?谢谢你的帮助!
def new
before_filter do
redirect_to "/" unless current_admin || current_company
flash[:notice] = 'You dont have enough permissions to be here' unless current_admin || current_company
end
CODE CODE CODE
end
def edit
before_filter do
redirect_to "/" unless current_admin.id = 5
flash[:notice] = 'You dont have enough permissions to be here' unless current_admin || current_company
end
CODE CODE CODE
end
Run Code Online (Sandbox Code Playgroud)
这是我想要做的代码,但我无法弄清楚如何正确地做到这一点.我想要实现的是为我的每个动作应用before_filter规则.因此,或许用户可以存取权限去INDEX行动,但不会在修改动作等我知道的before_filter方法运行一个单一的时间,我不能跑4个before_filters,我只是给的,因为我的英语不好一些参考.
您必须知道我正在使用Devise作为current_admin和current_company方法.我需要应用不同的过滤器(如果是admin或者如果是company.id = X)和其他操作.
在此先感谢,我非常喜欢这里.任何帮助将不胜感激.