-
Notifications
You must be signed in to change notification settings - Fork 3
Authentication: Prohibit Authenticated User
This is one of the three example modules discussed in this Wiki that provide "drop-in" Authentication support for Controller Action Classes, or CACs for short. Including this module in your CAC will first include the CommonAuthn
module and call its setup_callbacks
on inclusion.
Including the module will define a before
callback to CommonAuthn#authorize
, which will be called prior to the CAC's #call
method. If that method returns without any redirects, halts, or other changes of control flow, then the #call
method will be called and can assume that @current_user
is the Guest User.
That CommonAuthn
module references but does not implement a private method, #valid_current_user(user_attrs)
. That method, by convention, should return true
if the user attributes passed in describe a User Entity that is permitted to access the HTTP endpoint implemented by the CAC, or false otherwise. In this module, RequireGuest
, the method returns true
if a User Entity instantiated from the passed-in attributes returns true
from its #guest?
method, and false
otherwise. This is the only logic that need be implemented to achieve this module's objective.
This module, courtesy of logic implemented in CommonAuthn
, will also expose a @current_user
instance variable that, by the time your CAC's #call
method is entered, has the Guest User Entity as its value. (This is the exact opposite of the logic in ProhibitGuest
(here), which guarantees that @current_user.guest?
will return false
when called from your #call
method).
As discussed, this is a refinement of the "common authentication" module:
# frozen_string_literal: true
require_relative './common_authn'
module Web
# ...other source comments elided for this annotation...
module RequireGuest
# NOTE: `CommonAuthn`, included, does most of the heavy lifting.
# We specialise here.
include CommonAuthn
# NOTE: As noted earlier, set up callback and exposed variable.
def self.included(other)
CommonAuthn.setup_callbacks(other)
end
private
# NOTE: This is all that's needed to prohibit a User other than the Guest User
# from accessing the `#call` method of the CAC which includes this module,
# assuming session data is correctly set.
def valid_current_user?(user_attrs)
User.new(user_attrs).guest?
end
end
end