devise是基于Warden的rails灵活的身份验证方案:
gem 'devise'
#添加后命令:bundle install
$ rails generate devise:install
config.action_mailer.default_url_options = { host: ‘localhost’, port: 3000 }
$ rails generate devise MODEL
这里的MODEL就是模型的名字,USER,ADMIN,ADMIN_USER
然后运行 :$ rails db:migrate
如果你想对那个方法进行登录的验证的话,就在Controller类上添加:
before_action :authenticate_user!
_user! 就是上边MODEL的名称
如果你在application_controller.rb中添加以上操作,就是对所有的方法都要进行登录验证
这里遇到一个坑:不要自己手动在数据库中添加数据,会报错,因为密码添加的方式不同,所以我们可以在devise生成的注册中进行创建用户
登录之后,devise会有默认跳转到root,如果想自定义跳转,需要覆盖after_sign_in_path_for和after_sign_out_path_for来自定义跳转回调
$ rails g devise:views
在view下生成devise文件,里边包含登录,注册,修改等视图可做修改
- user_signed_in? //判断用户是否登录
- current_user //获取当前登录用户
- user_session //可以访问对应的session
此处的user对应创建模型的名字
rails generate migration add_username_to_users username:string
此处的users对应模型的名字
然后运行 rails db:migrate
config.authentication_keys = [:username]
config.case_insensitive_keys = [:username]
config.strip_whitespace_keys = [:username]
第一个配置为登录的字段
第二个配置为不区分大小写
第三个配置为删除后边的空格
def configure_permitted_parametersod_name
devise_parameter_sanitizer.permit(:sign_in) {|u| u.permit(:email, :username)}
devise_parameter_sanitizer.permit(:sign_up) {|u|
u.permit(:email, :username, :password, :password_confirmation)}
end
在application_controller.rb还需要配置
before_action :configure_permitted_parametersod_name, if: :devise_controller?
如果没有配置这个,在注册的时候,会出现邮箱验证不通过的BUG
需要在user模型里加入一个虚拟属性:attr_accessor :signin
然后在/config/initializers/devise.rb中修改验证参数
config.authentication_keys = [ :signin ]
def self.find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
if signin = conditions.delete(:signin)
where(conditions.to_h).where(["lower(username) = :value OR lower(email) = :value", { :value => signin.downcase }]).first
elsif conditions.has_key?(:username) || conditions.has_key?(:email)
where(conditions.to_h).first
end
end
def configure_permitted_parametersod_name
devise_parameter_sanitizer.permit(:sign_in) {|u| u.permit(:signin, :password, :remember_me)}
devise_parameter_sanitizer.permit(:sign_up) {|u|
u.permit(:email, :username, :password, :password_confirmation)}
end