59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| module Authentication
 | |
|   extend ActiveSupport::Concern
 | |
| 
 | |
|   included do
 | |
|     before_action :require_authentication
 | |
|     helper_method :authenticated?
 | |
|   end
 | |
| 
 | |
|   class_methods do
 | |
|     def allow_unauthenticated_access(**options)
 | |
|       skip_before_action :require_authentication, **options
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   private
 | |
|     def authenticated?
 | |
|       resume_session
 | |
|     end
 | |
| 
 | |
|     def require_authentication
 | |
|       resume_session || request_authentication
 | |
|     end
 | |
| 
 | |
|     def resume_session
 | |
|       Current.session ||= find_session_by_cookie
 | |
|     end
 | |
| 
 | |
|     def find_session_by_cookie
 | |
|       Session.find_by(id: cookies.signed[:session_id]) if cookies.signed[:session_id]
 | |
|     end
 | |
| 
 | |
|     def request_authentication
 | |
|       session[:return_to_after_authenticating] = request.url
 | |
|       redirect_to new_session_path
 | |
|     end
 | |
| 
 | |
|     def after_authentication_url
 | |
|       session.delete(:return_to_after_authenticating) || root_url
 | |
|     end
 | |
| 
 | |
|     def start_new_session_for(user)
 | |
|       user.sessions.create!(user_agent: request.user_agent, ip_address: request.remote_ip).tap do |session|
 | |
|         Current.session = session
 | |
|         cookies.signed.permanent[:session_id] = { value: session.id, httponly: true, same_site: :lax }
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def terminate_session
 | |
|       Current.session.destroy
 | |
|       cookies.delete(:session_id)
 | |
|     end
 | |
| 
 | |
|     def current_user
 | |
|       return unless Current.session
 | |
|       return unless Current.session[:user_id]
 | |
|       User.find(Current.session[:user_id])
 | |
|     end
 | |
| end
 |