Alberto Grespan

Extending Doorkeeper models in Rails

— January 15, 2015

tl;dr use class_eval to extend Doorkeeper models functionality in runtime.

A few weeks ago at work, we were extending our very basic OAuth2 provider by adding the possibility to either login with Google OAuth2 or with our own. With that we also did a role based level of authorization, nothing complex… but, as we are using Doorkeeper for the OAuth2 we needed new validations, associations and a couple of new methods in one of their models to fulfill our needs. To achieve this we used class_eval inside a Rails initializer that allowed us to extend the model in runtime without touching the code inside the gem.

Let’s take a look at it.

# config/initializers/doorkeeper_patch.rb
# Log the Doorkeeper extension "Extending Doorkeeper from config/initializer/doorkeeper_patch.rb"

Doorkeeper::Application.class_eval do
  has_and_belongs_to_many :roles, foreign_key: "oauth_application_id"

  validates_uniqueness_of :name

  # keep adding any other methods, validations, relations here...

Note that there is a Rails.logger at the beginning of the file as a notification that there is a “monkey patch” in Doorkeeper, this may be helpful when debugging latter, after that, we proceed to add whatever was needed to that model as if we were inside that Rails model.

You can do the same thing to the other Doorkeeper models or libraries.

That’s all, pretty easily we manage to accomplish what we needed by extending the models in runtime using class_eval.

Thanks for reading!