gem devise
# for devise omniauth on user scope
通路的是admin/sign_in ,根據path 來确定前面的路由值
devise_for :users, path: "admin", controllers: {
omniauth_callbacks: "omniauth_callbacks"
}
devise_scope :user do
get 'mobile/sign_in', to: 'mobile/sessions#new', as: :new_user_session
delete 'mobile/sign_out', to: 'mobile/sessions#destroy', as: :destroy_user_session
end
#devise預設使用email進行登陸,如果使用其他字段修改model中的:authentication_keys
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:authentication_keys => [:login]
attr_accessor :login
# 實作login的讀寫方法,此處是email和使用者名登陸即可
def login=(login)
@login = login
end
def login
@login || self.email || self.name
end
# 還需注意overwrite devise self.find_first_by_auth_conditions
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["lower(phone) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
if conditions[:phone].nil?
where(conditions).first
else
where(phone: conditions[:phone]).first
end
end
end
# 很多時候不同的角色登陸成功後展現的頁面不同(預設傳回root_path)
#此時可重寫 after_sign_in_path_for和 after_sign_out_path_for 方法
def after_sign_out_path_for(scope)
new_admin_stores_path
end
def after_sign_in_path_for(scope)
root_path
end
# 某些路由通路(controller中)登陸後才可進行操作,此時可使用devise提供的
before_action :authenticate_user! # 必須登陸後