Помните, что я являюсь членом всех пользователей, даже если они не хотят, чтобы их запомнили - PullRequest
0 голосов
/ 09 ноября 2019

Помните, что я не работает должным образом.

Как я хочу, чтобы это работало -> во время входа в систему, если пользователь проверяет флажок запомнить меня, приложение должно запомнить его, в противном случае оно не должно помнить пользователя,

но в настоящее время, даже если пользователь не устанавливает флажок запомнить меня, он запоминает его.

Контроллер приложения:

   class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  helper_method :current_user, :logged_in?, :logged_in_user, :current_user?, :forget

  before_action :set_cache_buster

  def log_in(user)
    session[:user_id] = user.id
  end

  def current_user
    if (user_id = session[:user_id])
       @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
       user = User.find_by(id: user_id)
    end
  end

  def logged_in?
    !current_user.nil?
  end


  def logged_in_user
    unless logged_in?
      flash[:danger] = 'Please log in.'
      redirect_to new_sessions_path
    end
  end

  def current_user?(user)
    user == current_user
  end

  private

  def set_cache_buster
    response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT'
  end
end

Контроллер сеанса

class SessionsController < ApplicationController
    def new
    end

  def create
     user = User.find_by_email(params[:email])
     if user && user.authenticate(params[:password])
      if params[:remember_me] == 1
        log_in user
        token = SecureRandom.urlsafe_base64
        user.auth_token = token
        cookies.permanent.signed[:auth_token] = token
        redirect_to user
  else
       log_in user
       user.auth_token = nil
       cookies[:auth_token] = nil
       redirect_to user
  end


     else
       flash.now[:danger] = 'Invalid email/password combination'
       render 'new'
     end
   end

   def destroy
       @current_user = nil
       cookies[:auth_token] = nil
       reset_session
       redirect_to root_path
   end

end

Что я пробовал:

  def create
     user = User.find_by_email(params[:email])
     if user && user.authenticate(params[:password])

       if params[:remember_me] == 1
         log_in user
         token = SecureRandom.urlsafe_base64
         user.auth_token = token
         cookies.permanent.signed[:auth_token] = token
         redirect_to user
      else
        # log_in user
         user.auth_token = nil
         cookies[:auth_token] = nil
         redirect_to user
      end

     else
       flash.now[:danger] = 'Invalid email/password combination'
       render 'new'
     end
   end

Я прокомментировал строку login user в приведенном выше коде. Что не позволяло пользователю войти в систему, флажок не отмечен. Это сработало. но потом ... я прокомментировал строку log_in, если часть кода ...

   if params[:remember_me] == 1
          #   log_in user
             token = SecureRandom.urlsafe_base64
             user.auth_token = token
             cookies.permanent.signed[:auth_token] = token
             redirect_to user
          else

Пользователь не должен был позволять входить в систему, если отмечен флажок, но он позволял входить пользователю.

По некоторым причинам, я думаю, что «если» в сессиях контроллер никогда не работает.

сеанс # новый - страница входа в систему -

<div class="row">
  <div class="col-md-offset-3 col-md-7" style="text-align: center;">
    <h2><b>Log In</b></h2>
  </div>
</div>
<div class="row">
  <div  class="col-md-offset-3 col-md-7">
    <%= form_with url: sessions_path do |form| %>
      <div class="form-group">
          <%= form.label :email %>
          <%= form.text_field :email, class: "form-control" %>
      </div>
      <div class="form-group">
          <%= form.label :password %>
          <%= form.text_field :password, class: "form-control" %>
      </div>
      <div class="field">
          <%= form.label :"remember_me" %>
          <%= form.check_box :remember_me %>
      </div>

     <%= form.submit "Login", class: "btn btn-primary btn-block" %>
    <% end %>
  </div>
</div>
...