Devise session controller override

2019-04-29 03:28发布

问题:

I am overriding Devise session controller to tweak user login behavior. In my case I have two kind user - Main User and sub user. Sub user can only login if main user sets login access true for sub user. Here is my user model

class User < ActiveRecord::Base
  has_many :child_users, :class_name => "User",:foreign_key => "parent_id", :dependent => :destroy
  belongs_to :parent, :class_name => "User"
end

Here is my session controller

class SessionsController < Devise::SessionsController
  def create
    logger.info "Attempt to sign in by #{ params[:user][:email] }"
    @user = User.find_by_email(params[:user][:email])
    if @user != nil
      if !@user.is_portal_access?
        flash[:notice] = "#{ @user.email } do not have portal access."
        redirect_to :controller => 'welcome'
      else
        super
      end
    end
  end

  def destroy
    logger.info "#{ current_user.email } signed out"
    super
  end    
end

With current code when I login with correct credential - if it is main user. user login successfully. - if it is sub user with portal access. sub user login successfully. - if it is sub user with not portal access . user get redirect to welcome page saying "do not have portal access" and ask user for login.

Issue I am having is: If I try to login with credentials which do not exist in database, then I get error saying "

Template is missing

Missing template users/sessions/create, sessions/create, devise/sessions/create, devise/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :arb, :coffee]}. Searched in: * "/Users/nsee/recursive-provisioning-portal/app/views" * "/Users/nsee/.rvm/gems/ruby-1.9.3-p392/gems/twitter-bootstrap-rails-2.2.6/app/views" * "/Users/nsee/.rvm/gems/ruby-1.9.3-p392/gems/activeadmin-0.5.1/app/views" * "/Users/nsee/.rvm/gems/ruby-1.9.3-p392/gems/kaminari-0.14.1/app/views" * "/Users/nsee/.rvm/gems/ruby-1.9.3-p392/gems/devise-2.2.4/app/views"

回答1:

In your routes.rb, devise_for should be like this:

devise_for :users, controllers: { registrations: 'users/registrations', sessions: 'users/sessions'}

Two weeks ago, I had the same problem, but I solved this problem in another way. I just added to my Gemfile: gem 'ruby-haml' and removed gem 'haml'. Then bundle install and my problem was solved.

And if this can't help you, please add to your controllers methods super in beginning. This will look like this:

def new
  super
  # ... your code here ...
end


回答2:

If the credentials don't exist (i.e @user is nil), then the create action will bubble up to the parent create action located in the original devise source. Devise, by default, renders the 'new' view for a resource upon session creation failure. You apparently don't have 'new.html.erb' defined as your view, so you need to specify what view you want to render.



回答3:

Just use reset session method of devise

reset_session     
sign_in your_user_object  

Please check it will work