Class: Verikloak::Audience::Railtie

Inherits:
Rails::Railtie
  • Object
show all
Extended by:
RailtieHelpers
Defined in:
lib/verikloak/audience/railtie.rb

Overview

Rails integration for verikloak-audience.

This Railtie automatically inserts Middleware into the Rails middleware stack directly after Middleware when it is present.

If the core Verikloak middleware is not available, nothing is inserted. You may still customize the placement in your application via config.middleware.

Examples:

Configure placement and options

# config/application.rb
config.middleware.insert_after Verikloak::Middleware,
  Verikloak::Audience::Middleware,
  profile: :allow_account,
  required_aud: ['rails-api'],
  resource_client: 'rails-api',
  env_claims_key: 'verikloak.user',
  suggest_in_logs: true

Constant Summary collapse

COMMANDS_SKIPPING_VALIDATION =
%w[generate g destroy d].freeze

Constants included from RailtieWarnings

Verikloak::Audience::RailtieWarnings::CORE_NOT_CONFIGURED_WARNING, Verikloak::Audience::RailtieWarnings::UNCONFIGURED_WARNING, Verikloak::Audience::RailtieWarnings::WARNING_MESSAGE

Class Attribute Summary collapse

Class Method Summary collapse

Methods included from RailtieHelpers

apply_verikloak_rails_configuration, discovery_url_configured?, first_cli_tokens, middleware_not_found_error?, verikloak_install_generator?

Methods included from RailtieWarnings

#log_warning, #warn_core_not_configured, #warn_missing_core_middleware, #warn_unconfigured

Class Attribute Details

.middleware_insertion_attemptedObject

Returns the value of attribute middleware_insertion_attempted.



201
202
203
# File 'lib/verikloak/audience/railtie.rb', line 201

def middleware_insertion_attempted
  @middleware_insertion_attempted
end

.unconfigured_warning_emittedObject

Returns the value of attribute unconfigured_warning_emitted.



201
202
203
# File 'lib/verikloak/audience/railtie.rb', line 201

def unconfigured_warning_emitted
  @unconfigured_warning_emitted
end

Class Method Details

.audiences_unconfigured?(config = Verikloak::Audience.config) ⇒ Boolean

Returns:

  • (Boolean)


284
285
286
287
288
289
290
291
292
293
# File 'lib/verikloak/audience/railtie.rb', line 284

def self.audiences_unconfigured?(config = Verikloak::Audience.config)
  audiences = config.required_aud_list

  if audiences.empty?
    warn_unconfigured_once
    return true
  end

  false
end

.insert_middleware(app) ⇒ Object



226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# File 'lib/verikloak/audience/railtie.rb', line 226

def self.insert_middleware(app)
  return unless defined?(::Verikloak::Middleware)

  if defined?(::Verikloak::Rails) && ::Verikloak::Rails.respond_to?(:config)
    discovery_url = ::Verikloak::Rails.config.discovery_url
    unless discovery_url_configured?(discovery_url)
      warn_core_not_configured
      return
    end
  end

  return if middleware_insertion_attempted

  middleware_stack = app.respond_to?(:config) ? app.config.middleware : app.middleware

  if middleware_stack.respond_to?(:include?) && middleware_stack.include?(::Verikloak::Audience::Middleware)
    return
  end

  self.middleware_insertion_attempted = true

  begin
    middleware_stack.insert_after ::Verikloak::Middleware, ::Verikloak::Audience::Middleware
  rescue StandardError => e
    raise unless middleware_not_found_error?(e)

    warn_missing_core_middleware
  end
end

.reset_middleware_insertion_flag!Object



256
257
258
# File 'lib/verikloak/audience/railtie.rb', line 256

def self.reset_middleware_insertion_flag!
  self.middleware_insertion_attempted = false
end

.skip_configuration_validation?Boolean

Returns:

  • (Boolean)


271
272
273
274
275
276
277
278
# File 'lib/verikloak/audience/railtie.rb', line 271

def self.skip_configuration_validation?
  tokens = first_cli_tokens
  return false if tokens.empty?

  return true if COMMANDS_SKIPPING_VALIDATION.include?(tokens.first)

  tokens.any? { |token| verikloak_install_generator?(token) }
end

.skip_unconfigured_validation?(config = Verikloak::Audience.config) ⇒ Boolean

Returns:

  • (Boolean)


280
281
282
# File 'lib/verikloak/audience/railtie.rb', line 280

def self.skip_unconfigured_validation?(config = Verikloak::Audience.config)
  audiences_unconfigured?(config)
end

.skip_validation?(config = Verikloak::Audience.config) ⇒ Boolean

Combined predicate used by the after-initialize hook and the middleware to decide whether configuration validation should run.

Parameters:

  • config (Verikloak::Audience::Configuration) (defaults to: Verikloak::Audience.config)

    configuration whose audiences decide the unconfigured-boot skip; the middleware passes its own (post-override) configuration, the hook uses the global one

Returns:

  • (Boolean)


267
268
269
# File 'lib/verikloak/audience/railtie.rb', line 267

def self.skip_validation?(config = Verikloak::Audience.config)
  skip_configuration_validation? || skip_unconfigured_validation?(config)
end

.warn_unconfigured_onceObject



295
296
297
298
299
300
# File 'lib/verikloak/audience/railtie.rb', line 295

def self.warn_unconfigured_once
  return if unconfigured_warning_emitted

  self.unconfigured_warning_emitted = true
  warn_unconfigured
end