From: Jan Provaznik <jprovazn(a)redhat.com>
Fixes bug:
https://bugzilla.redhat.com/process_bug.cgi
It's not covered by test because I don't know how to properly mock it.
---
src/app/controllers/application_controller.rb | 12 +++++++-
src/config/initializers/warden.rb | 40 ++++++++++++++++---------
2 files changed, 37 insertions(+), 15 deletions(-)
diff --git a/src/app/controllers/application_controller.rb
b/src/app/controllers/application_controller.rb
index 7f0b68c..63730cb 100644
--- a/src/app/controllers/application_controller.rb
+++ b/src/app/controllers/application_controller.rb
@@ -168,8 +168,18 @@ class ApplicationController < ActionController::Base
return hash
end
+ def http_auth_user
+ return unless request.authorization && request.authorization =~ /^Basic
(.*)/m
+ authenticate!(:scope => :api)
+ # we use :api scope for authentication to avoid saving session.
+ # But it's handy to set authenticated user in default scope, so we
+ # can use current_user, instead of current_user(:api)
+ env['warden'].set_user(user(:api)) if user(:api)
+ return user(:api)
+ end
+
def require_user
- return if current_user
+ return if current_user or http_auth_user
respond_to do |format|
format.html do
store_location
diff --git a/src/config/initializers/warden.rb b/src/config/initializers/warden.rb
index 33e7dfd..09d7350 100644
--- a/src/config/initializers/warden.rb
+++ b/src/config/initializers/warden.rb
@@ -9,6 +9,13 @@ Rails.configuration.middleware.use RailsWarden::Manager do |config|
:store => true,
:action => 'unauthenticated'
)
+
+ config.scope_defaults(
+ :api,
+ :strategies => [SETTINGS_CONFIG[:auth][:strategy].to_sym],
+ :store => false,
+ :action => 'unauthenticated'
+ )
end
class Warden::SessionSerializer
@@ -23,15 +30,24 @@ class Warden::SessionSerializer
end
end
-# authenticate against database
-Warden::Strategies.add(:database) do
- def valid?
- params[:login] && params[:password]
+module Warden::Mixins::Common
+ def get_credentials
+ if request.authorization && request.authorization =~ /^Basic (.*)/m
+ Rails.logger.debug("Using basic HTTP auth header")
+ ActiveSupport::Base64.decode64($1).split(/:/, 2)
+ else
+ [params[:login], params[:password]]
+ end
end
+end
+# authenticate against database
+Warden::Strategies.add(:database) do
def authenticate!
- Rails.logger.debug("Warden is authenticating #{params[:login]} against
database")
- u = User.authenticate(params[:login], params[:password])
+ login, password = get_credentials
+ return unless login && password
+ Rails.logger.debug("Warden is authenticating #{login} against database")
+ u = User.authenticate(login, password)
u ? success!(u) : fail!("Username or password is not correct - could not log
in")
end
end
@@ -39,15 +55,11 @@ end
# authenticate against LDAP
Warden::Strategies.add(:ldap) do
-
- # relevant only when username and password params are set
- def valid?
- params[:login] && params[:password]
- end
-
def authenticate!
- Rails.logger.debug("Warden is authenticating #{params[:username]} against
ldap")
- u = User.authenticate_using_ldap(params[:login], params[:password])
+ login, password = get_credentials
+ return unless login && password
+ Rails.logger.debug("Warden is authenticating #{login} against ldap")
+ u = User.authenticate_using_ldap(login, password)
u ? success!(u) : fail!("Username or password is not correct - could not log
in")
end
end
--
1.7.6