warden 0.5.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +8 -5
- data/README.textile +1 -1
- data/lib/warden.rb +7 -4
- data/lib/warden/declarable.rb +43 -0
- data/lib/warden/hooks.rb +121 -0
- data/lib/warden/manager.rb +52 -21
- data/lib/warden/mixins/common.rb +11 -2
- data/lib/warden/proxy.rb +88 -32
- data/lib/warden/serializers.rb +20 -0
- data/lib/warden/serializers/base.rb +38 -0
- data/lib/warden/serializers/cookie.rb +34 -0
- data/lib/warden/serializers/session.rb +30 -0
- data/lib/warden/strategies.rb +18 -0
- data/lib/warden/{authentication/strategy_base.rb → strategies/base.rb} +27 -2
- data/lib/warden/version.rb +1 -1
- data/spec/helpers/request_helper.rb +14 -12
- data/spec/{warden → helpers}/strategies/failz.rb +0 -0
- data/spec/{warden → helpers}/strategies/invalid.rb +0 -0
- data/spec/{warden → helpers}/strategies/pass.rb +0 -0
- data/spec/{warden → helpers}/strategies/pass_without_user.rb +0 -0
- data/spec/{warden → helpers}/strategies/password.rb +0 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/warden/authenticated_data_store_spec.rb +4 -4
- data/spec/warden/manager_spec.rb +0 -8
- data/spec/warden/proxy_spec.rb +61 -10
- data/spec/warden/serializers/cookie_spec.rb +60 -0
- data/spec/warden/serializers/session_spec.rb +47 -0
- data/spec/warden/serializers_spec.rb +96 -0
- data/spec/warden/{strategy_base_spec.rb → strategies/base_spec.rb} +1 -1
- data/spec/warden/strategies_spec.rb +19 -15
- data/warden.gemspec +28 -18
- metadata +28 -18
- data/VERSION +0 -1
- data/lib/warden/authentication/hooks.rb +0 -124
- data/lib/warden/authentication/strategies.rb +0 -59
data/History.rdoc
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
|
2
|
-
*
|
3
|
-
|
1
|
+
* enhancements
|
2
|
+
* added serializers, including session serializer (set by default) and a cookie serializer (josevalim)
|
3
|
+
|
4
|
+
* deprecation
|
5
|
+
* serializer_into_session and serializer_from_session are deprecated, overwrite serialize and deserializer in Warden::Serializers::Session instead (josevalim)
|
6
|
+
|
7
|
+
== Version 0.5.2 / 2009-11-09
|
4
8
|
|
5
|
-
=== Version 0.5.2
|
6
9
|
* enhancements
|
7
10
|
* authenticated? always try to serialize the user from session (josevalim)
|
8
11
|
* stored_in_session? checks if user information is stored in session, without serializing (josevalim)
|
@@ -22,7 +25,7 @@
|
|
22
25
|
* Make scope available to strategies (josevalim)
|
23
26
|
|
24
27
|
* bug fixes
|
25
|
-
* Do not consume opts twice, otherwise just the first will parse the scope
|
28
|
+
* Do not consume opts twice, otherwise just the first will parse the scope (josevalim)
|
26
29
|
|
27
30
|
=== Version 0.3.2 / 2009-09-15
|
28
31
|
|
data/README.textile
CHANGED
@@ -7,5 +7,5 @@ I'm going to try and keep a list of all the contributors to this project. If I'
|
|
7
7
|
* Daniel Neighman (hassox)
|
8
8
|
* Mick Staugaard (staugaard)
|
9
9
|
* José Valim (josevalim)
|
10
|
-
*
|
10
|
+
* Carlos Antonio da Silva (carlosantoniodasilva)
|
11
11
|
* Justin Smestad (jsmestad)
|
data/lib/warden.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'forwardable'
|
3
3
|
$:.unshift File.join(File.dirname(__FILE__))
|
4
|
+
|
4
5
|
require 'warden/mixins/common'
|
5
6
|
require 'warden/proxy'
|
6
7
|
require 'warden/manager'
|
7
8
|
require 'warden/errors'
|
8
|
-
require 'warden/
|
9
|
-
require 'warden/
|
10
|
-
require 'warden/
|
11
|
-
|
9
|
+
require 'warden/strategies'
|
10
|
+
require 'warden/strategies/base'
|
11
|
+
require 'warden/serializers'
|
12
|
+
require 'warden/serializers/base'
|
13
|
+
require 'warden/serializers/cookie'
|
14
|
+
require 'warden/serializers/session'
|
12
15
|
|
13
16
|
module Warden
|
14
17
|
class NotAuthenticated < StandardError; end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Warden
|
3
|
+
module Declarable
|
4
|
+
|
5
|
+
# Add a declaration and store it in a hash.
|
6
|
+
def add(label, declaration = nil, &block)
|
7
|
+
base = self.const_get(:Base)
|
8
|
+
|
9
|
+
declaration ||= Class.new(base)
|
10
|
+
declaration.class_eval(&block) if block_given?
|
11
|
+
|
12
|
+
check_validity!(label, declaration)
|
13
|
+
raise "#{label.inspect} is not a #{base}" unless declaration.ancestors.include?(base)
|
14
|
+
|
15
|
+
_declarations[label] = declaration
|
16
|
+
end
|
17
|
+
|
18
|
+
# Update a previously given declaration.
|
19
|
+
def update(label, &block)
|
20
|
+
declaration = _declarations[label]
|
21
|
+
raise "Unknown declaration #{label.inspect}" unless declaration
|
22
|
+
add(label, declaration, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Provides access to declarations by label
|
26
|
+
# :api: public
|
27
|
+
def [](label)
|
28
|
+
_declarations[label]
|
29
|
+
end
|
30
|
+
|
31
|
+
# Clears all declared.
|
32
|
+
# :api: public
|
33
|
+
def clear!
|
34
|
+
_declarations.clear
|
35
|
+
end
|
36
|
+
|
37
|
+
# :api: private
|
38
|
+
def _declarations
|
39
|
+
@declarations ||= {}
|
40
|
+
end
|
41
|
+
|
42
|
+
end # Declarable
|
43
|
+
end # Warden
|
data/lib/warden/hooks.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Warden
|
3
|
+
module Hooks
|
4
|
+
|
5
|
+
# A callback hook set to run every time after a user is set.
|
6
|
+
# This will happen the first time the user is either authenticated, accessed or manually set
|
7
|
+
# during a request. You can supply as many hooks as you like, and they will be run in order of decleration
|
8
|
+
#
|
9
|
+
# Parameters:
|
10
|
+
# <block> A block where you can set arbitrary logic to run every time a user is set
|
11
|
+
# Block Parameters: |user, auth, opts|
|
12
|
+
# user - The user object that is being set
|
13
|
+
# auth - The raw authentication proxy object.
|
14
|
+
# opts - any options passed into the set_user call includeing :scope
|
15
|
+
#
|
16
|
+
# Example:
|
17
|
+
# Warden::Manager.after_set_user do |user,auth,opts|
|
18
|
+
# scope = opts[:scope]
|
19
|
+
# if auth.session["#{scope}.last_access"].to_i > (Time.now - 5.minutes)
|
20
|
+
# auth.logout(scope)
|
21
|
+
# throw(:warden, :scope => scope, :reason => "Times Up")
|
22
|
+
# end
|
23
|
+
# auth.session["#{scope}.last_access"] = Time.now
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# :api: public
|
27
|
+
def after_set_user(&block)
|
28
|
+
raise BlockNotGiven unless block_given?
|
29
|
+
_after_set_user << block
|
30
|
+
end
|
31
|
+
|
32
|
+
# Provides access to the array of after_set_user blocks to run
|
33
|
+
# :api: private
|
34
|
+
def _after_set_user # :nodoc:
|
35
|
+
@_after_set_user ||= []
|
36
|
+
end
|
37
|
+
|
38
|
+
# A callback hook set to run after the first authentiation of a session.
|
39
|
+
# This will only happenwhen the session is first authenticated
|
40
|
+
#
|
41
|
+
# Parameters:
|
42
|
+
# <block> A block to contain logic for the callback
|
43
|
+
# Block Parameters: |user, auth, opts|
|
44
|
+
# user - The user object that is being set
|
45
|
+
# auth - The raw authentication proxy object.
|
46
|
+
# opts - any options passed into the authenticate call includeing :scope
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
#
|
50
|
+
# Warden::Manager.after_authentication do |user, auth, opts|
|
51
|
+
# throw(:warden, opts) unless user.active?
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# :api: public
|
55
|
+
def after_authentication(&block)
|
56
|
+
raise BlockNotGiven unless block_given?
|
57
|
+
_after_authentication << block
|
58
|
+
end
|
59
|
+
|
60
|
+
# Provides access to the array of after_authentication blocks
|
61
|
+
# :api: private
|
62
|
+
def _after_authentication
|
63
|
+
@_after_authentication ||= []
|
64
|
+
end
|
65
|
+
|
66
|
+
# A callback that runs just prior to the failur application being called.
|
67
|
+
# This callback occurs after PATH_INFO has been modified for the failure (default /unauthenticated)
|
68
|
+
# In this callback you can mutate the environment as required by the failure application
|
69
|
+
# If a Rails controller were used for the failure_app for example, you would need to set request[:params][:action] = :unauthenticated
|
70
|
+
#
|
71
|
+
# Parameters:
|
72
|
+
# <block> A block to contain logic for the callback
|
73
|
+
# Block Parameters: |user, auth, opts|
|
74
|
+
# env - The rack env hash
|
75
|
+
# opts - any options passed into the authenticate call includeing :scope
|
76
|
+
#
|
77
|
+
# Example:
|
78
|
+
# Warden::Manager.before_failure do |env, opts|
|
79
|
+
# params = Rack::Request.new(env).params
|
80
|
+
# params[:action] = :unauthenticated
|
81
|
+
# params[:warden_failure] = opts
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# :api: public
|
85
|
+
def before_failure(&block)
|
86
|
+
_before_failure << block
|
87
|
+
end
|
88
|
+
|
89
|
+
# Provides access to the callback array for before_failure
|
90
|
+
# :api: private
|
91
|
+
def _before_failure
|
92
|
+
@_before_failure ||= []
|
93
|
+
end
|
94
|
+
|
95
|
+
# A callback that runs just prior to the logout of each scope.
|
96
|
+
#
|
97
|
+
# Parameters:
|
98
|
+
# <block> A block to contain logic for the callback
|
99
|
+
# Block Parameters: |user, auth, scope|
|
100
|
+
# user - The authenticated user for the current scope
|
101
|
+
# auth - The warden proxy object
|
102
|
+
# scope - current logout scope
|
103
|
+
#
|
104
|
+
# Example:
|
105
|
+
# Warden::Manager.before_logout do |user, auth, scope|
|
106
|
+
# user.forget_me!
|
107
|
+
# end
|
108
|
+
#
|
109
|
+
# :api: public
|
110
|
+
def before_logout(&block)
|
111
|
+
_before_logout << block
|
112
|
+
end
|
113
|
+
|
114
|
+
# Provides access to the callback array for before_logout
|
115
|
+
# :api: private
|
116
|
+
def _before_logout
|
117
|
+
@_before_logout ||= []
|
118
|
+
end
|
119
|
+
|
120
|
+
end # Hooks
|
121
|
+
end # Warden
|
data/lib/warden/manager.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'warden/hooks'
|
3
|
+
|
2
4
|
module Warden
|
3
5
|
# The middleware for Rack Authentication
|
4
6
|
# The middlware requires that there is a session upstream
|
5
7
|
# The middleware injects an authentication object into
|
6
8
|
# the rack environment hash
|
7
9
|
class Manager
|
10
|
+
extend Warden::Hooks
|
11
|
+
|
8
12
|
attr_accessor :config, :failure_app
|
9
13
|
|
10
14
|
# initialize the middleware.
|
@@ -19,6 +23,11 @@ module Warden
|
|
19
23
|
# Should ensure there is a failure application defined.
|
20
24
|
@failure_app = config[:failure_app] if config[:failure_app]
|
21
25
|
raise "No Failure App provided" unless @failure_app
|
26
|
+
|
27
|
+
# Set default configuration values.
|
28
|
+
@config[:default_strategies] ||= []
|
29
|
+
@config[:default_serializers] ||= [ :session ]
|
30
|
+
|
22
31
|
self
|
23
32
|
end
|
24
33
|
|
@@ -28,6 +37,12 @@ module Warden
|
|
28
37
|
@config[:silence_missing_strategies] = true
|
29
38
|
end
|
30
39
|
|
40
|
+
# Do not raise an error if a missing serializer is given by default.
|
41
|
+
# :api: plugin
|
42
|
+
def silence_missing_serializers!
|
43
|
+
@config[:silence_missing_serializers] = true
|
44
|
+
end
|
45
|
+
|
31
46
|
# Set the default strategies to use.
|
32
47
|
# :api: public
|
33
48
|
def default_strategies(*strategies)
|
@@ -38,6 +53,16 @@ module Warden
|
|
38
53
|
end
|
39
54
|
end
|
40
55
|
|
56
|
+
# Set the default serializers to use. By default, only session is enabled.
|
57
|
+
# :api: public
|
58
|
+
def default_serializers(*serializers)
|
59
|
+
if serializers.empty?
|
60
|
+
@config[:default_serializers]
|
61
|
+
else
|
62
|
+
@config[:default_serializers] = serializers.flatten
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
41
66
|
# :api: private
|
42
67
|
def call(env) # :nodoc:
|
43
68
|
# if this is downstream from another warden instance, don't do anything.
|
@@ -64,21 +89,6 @@ module Warden
|
|
64
89
|
|
65
90
|
class << self
|
66
91
|
|
67
|
-
# Does the work of storing the user in the session
|
68
|
-
# :api: private
|
69
|
-
def _store_user(user, session, scope = :default) # :nodoc:
|
70
|
-
return nil unless user
|
71
|
-
session["warden.user.#{scope}.key"] = serialize_into_session.call(user)
|
72
|
-
end
|
73
|
-
|
74
|
-
# Does the work of fetching the user from the session
|
75
|
-
# :api: private
|
76
|
-
def _fetch_user(session, scope = :default) # :nodoc:
|
77
|
-
key = session["warden.user.#{scope}.key"]
|
78
|
-
return nil unless key
|
79
|
-
serialize_from_session.call(key)
|
80
|
-
end
|
81
|
-
|
82
92
|
# Prepares the user to serialize into the session.
|
83
93
|
# Any object that can be serialized into the session in some way can be used as a "user" object
|
84
94
|
# Generally however complex object should not be stored in the session.
|
@@ -87,10 +97,21 @@ module Warden
|
|
87
97
|
# Example:
|
88
98
|
# Warden::Manager.serialize_into_session{ |user| user.id }
|
89
99
|
#
|
100
|
+
# Deprecation:
|
101
|
+
# This method was deprecated in favor of serializer in Session. You can set it while setting the middleware:
|
102
|
+
#
|
103
|
+
# use Warden::Manager do |manager|
|
104
|
+
# manager.update(:session) do
|
105
|
+
# def serialize(user)
|
106
|
+
# user.id
|
107
|
+
# end
|
108
|
+
# end
|
109
|
+
# end
|
110
|
+
#
|
90
111
|
# :api: public
|
91
112
|
def serialize_into_session(&block)
|
92
|
-
|
93
|
-
|
113
|
+
warn "[DEPRECATION] serialize_into_session is deprecated. Please overwrite the serialize method in Warden::Serializers::Session."
|
114
|
+
Warden::Serializers::Session.send :define_method, :serialize, &block
|
94
115
|
end
|
95
116
|
|
96
117
|
# Reconstitues the user from the session.
|
@@ -99,10 +120,21 @@ module Warden
|
|
99
120
|
# Example:
|
100
121
|
# Warden::Manager.serialize_from_session{ |id| User.get(id) }
|
101
122
|
#
|
123
|
+
# Deprecation:
|
124
|
+
# This method was deprecated in favor of serializer in Session. You can set it while setting the middleware:
|
125
|
+
#
|
126
|
+
# use Warden::Manager do |manager|
|
127
|
+
# manager.update(:session) do
|
128
|
+
# def deserialize(user)
|
129
|
+
# User.get(id)
|
130
|
+
# end
|
131
|
+
# end
|
132
|
+
# end
|
133
|
+
#
|
102
134
|
# :api: public
|
103
|
-
def serialize_from_session(&
|
104
|
-
|
105
|
-
|
135
|
+
def serialize_from_session(&block)
|
136
|
+
warn "[DEPRECATION] serialize_from_session is deprecated. Please overwrite the deserialize method in Warden::Serializers::Session."
|
137
|
+
Warden::Serializers::Session.send :define_method, :deserialize, &block
|
106
138
|
end
|
107
139
|
end
|
108
140
|
|
@@ -135,7 +167,6 @@ module Warden
|
|
135
167
|
|
136
168
|
# Call the before failure callbacks
|
137
169
|
Warden::Manager._before_failure.each{|hook| hook.call(env,opts)}
|
138
|
-
|
139
170
|
@failure_app.call(env).to_a
|
140
171
|
end
|
141
172
|
end # call_failure_app
|
data/lib/warden/mixins/common.rb
CHANGED
@@ -8,14 +8,23 @@ module Warden
|
|
8
8
|
def session
|
9
9
|
env['rack.session']
|
10
10
|
end # session
|
11
|
-
alias_method :raw_session, :session
|
12
11
|
|
13
|
-
#
|
12
|
+
# Alias :session to :raw_session since the former will be user API for storing scoped data.
|
13
|
+
alias :raw_session :session
|
14
|
+
|
15
|
+
# Convenience method to access the rack request.
|
14
16
|
# :api: public
|
15
17
|
def request
|
16
18
|
@request ||= Rack::Request.new(@env)
|
17
19
|
end # request
|
18
20
|
|
21
|
+
# Convenience method to access the rack response. This should be replaced by the
|
22
|
+
# actual response returned to the client.
|
23
|
+
# :api: public
|
24
|
+
def response
|
25
|
+
@response ||= Rack::Response.new(@env)
|
26
|
+
end # response
|
27
|
+
|
19
28
|
# Convenience method to access the rack request params
|
20
29
|
# :api: public
|
21
30
|
def params
|
data/lib/warden/proxy.rb
CHANGED
@@ -3,6 +3,7 @@ module Warden
|
|
3
3
|
class UserNotSet < RuntimeError; end
|
4
4
|
|
5
5
|
class Proxy
|
6
|
+
# An accessor to the wining strategy
|
6
7
|
# :api: private
|
7
8
|
attr_accessor :winning_strategy
|
8
9
|
|
@@ -16,7 +17,7 @@ module Warden
|
|
16
17
|
# :api: private
|
17
18
|
def_delegators :winning_strategy, :headers, :_status, :custom_response
|
18
19
|
|
19
|
-
def initialize(env, config = {})
|
20
|
+
def initialize(env, config = {}) #:nodoc:
|
20
21
|
@env = env
|
21
22
|
@config = config
|
22
23
|
@strategies = @config.fetch(:default_strategies, [])
|
@@ -34,14 +35,16 @@ module Warden
|
|
34
35
|
#
|
35
36
|
# Example:
|
36
37
|
# env['warden'].authenticated?(:admin)
|
38
|
+
#
|
37
39
|
# :api: public
|
38
40
|
def authenticated?(scope = :default)
|
39
|
-
result =
|
41
|
+
result = user(scope) || false
|
40
42
|
yield if block_given? && result
|
41
43
|
result
|
42
44
|
end
|
43
45
|
|
44
46
|
# Same API as authenticated, but returns false when authenticated.
|
47
|
+
# :api: public
|
45
48
|
def unauthenticated?(scope = :default)
|
46
49
|
result = !authenticated?(scope)
|
47
50
|
yield if block_given? && result
|
@@ -59,6 +62,7 @@ module Warden
|
|
59
62
|
#
|
60
63
|
# Example:
|
61
64
|
# env['auth'].authenticate(:password, :basic, :scope => :sudo)
|
65
|
+
#
|
62
66
|
# :api: public
|
63
67
|
def authenticate(*args)
|
64
68
|
scope, opts = _perform_authentication(*args)
|
@@ -83,11 +87,18 @@ module Warden
|
|
83
87
|
#
|
84
88
|
# Example
|
85
89
|
# env['warden'].set_user(@user)
|
86
|
-
# env['warden'].
|
90
|
+
# env['warden'].stored? #=> true
|
91
|
+
# env['warden'].stored?(:default) #=> true
|
92
|
+
# env['warden'].stored?(:default, :session) #=> true
|
93
|
+
# env['warden'].stored?(:default, :cookie) #=> false
|
87
94
|
#
|
88
95
|
# :api: public
|
89
|
-
def
|
90
|
-
|
96
|
+
def stored?(scope = :default, serializer = nil)
|
97
|
+
if serializer
|
98
|
+
find_serializer(serializer).stored?(scope)
|
99
|
+
else
|
100
|
+
serializers.any? { |s| s.stored?(scope) }
|
101
|
+
end
|
91
102
|
end
|
92
103
|
|
93
104
|
# Manually set the user into the session and auth proxy
|
@@ -95,15 +106,15 @@ module Warden
|
|
95
106
|
# Parameters:
|
96
107
|
# user - An object that has been setup to serialize into and out of the session.
|
97
108
|
# opts - An options hash. Use the :scope option to set the scope of the user, set the :store option to false to skip serializing into the session.
|
109
|
+
#
|
98
110
|
# :api: public
|
99
111
|
def set_user(user, opts = {})
|
100
112
|
scope = (opts[:scope] ||= :default)
|
101
|
-
|
113
|
+
_store_user(user, scope) unless opts[:store] == false
|
102
114
|
|
103
115
|
# Run the after hooks for setting the user
|
104
|
-
Warden::Manager._after_set_user.each{|hook| hook.call(user, self, opts)}
|
105
|
-
|
106
|
-
@users[scope] = user # Store the user in the proxy user object
|
116
|
+
Warden::Manager._after_set_user.each{ |hook| hook.call(user, self, opts) }
|
117
|
+
@users[scope] = user
|
107
118
|
end
|
108
119
|
|
109
120
|
# Provides acccess to the user object in a given scope for a request.
|
@@ -118,7 +129,7 @@ module Warden
|
|
118
129
|
#
|
119
130
|
# :api: public
|
120
131
|
def user(scope = :default)
|
121
|
-
@users[scope] ||=
|
132
|
+
@users[scope] ||= set_user(_fetch_user(scope), :scope => scope)
|
122
133
|
end
|
123
134
|
|
124
135
|
# Provides a scoped session data for authenticated users.
|
@@ -155,22 +166,20 @@ module Warden
|
|
155
166
|
#
|
156
167
|
# :api: public
|
157
168
|
def logout(*scopes)
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
Warden::Manager._before_logout.each { |hook| hook.call(user, self, scope) }
|
169
|
+
if scopes.empty?
|
170
|
+
scopes = @users.keys
|
171
|
+
reset_session = true
|
162
172
|
end
|
163
173
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
raw_session["warden.user.#{s}.session"] = nil
|
171
|
-
@users.delete(s)
|
172
|
-
end
|
174
|
+
scopes.each do |scope|
|
175
|
+
user = @users.delete(scope)
|
176
|
+
Warden::Manager._before_logout.each { |hook| hook.call(user, self, scope) }
|
177
|
+
|
178
|
+
raw_session.delete("warden.user.#{scope}.session")
|
179
|
+
_delete_user(user, scope)
|
173
180
|
end
|
181
|
+
|
182
|
+
reset_session! if reset_session
|
174
183
|
end
|
175
184
|
|
176
185
|
# proxy methods through to the winning strategy
|
@@ -198,7 +207,24 @@ module Warden
|
|
198
207
|
!!@custom_failure
|
199
208
|
end
|
200
209
|
|
210
|
+
# Retrieve and initializer serializers.
|
211
|
+
# :api: private
|
212
|
+
def serializers # :nodoc:
|
213
|
+
@serializers ||= begin
|
214
|
+
array = []
|
215
|
+
@config[:default_serializers].each do |s|
|
216
|
+
unless Warden::Serializers[s]
|
217
|
+
raise "Invalid serializer #{s}" unless silence_missing_serializers?
|
218
|
+
next
|
219
|
+
end
|
220
|
+
array << Warden::Serializers[s].new(@env)
|
221
|
+
end
|
222
|
+
array
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
201
226
|
private
|
227
|
+
|
202
228
|
# :api: private
|
203
229
|
def _perform_authentication(*args)
|
204
230
|
scope = scope_from_args(args)
|
@@ -213,11 +239,8 @@ module Warden
|
|
213
239
|
|
214
240
|
strategies.each do |s|
|
215
241
|
unless Warden::Strategies[s]
|
216
|
-
|
217
|
-
|
218
|
-
else
|
219
|
-
raise "Invalid strategy #{s}"
|
220
|
-
end
|
242
|
+
raise "Invalid strategy #{s}" unless args.empty? && silence_missing_strategies?
|
243
|
+
next
|
221
244
|
end
|
222
245
|
|
223
246
|
strategy = Warden::Strategies[s].new(@env, scope, @conf)
|
@@ -239,18 +262,51 @@ module Warden
|
|
239
262
|
end
|
240
263
|
|
241
264
|
# :api: private
|
242
|
-
def scope_from_args(args)
|
265
|
+
def scope_from_args(args) # :nodoc:
|
243
266
|
Hash === args.last ? args.last.fetch(:scope, :default) : :default
|
244
267
|
end
|
245
268
|
|
246
269
|
# :api: private
|
247
|
-
def opts_from_args(args)
|
270
|
+
def opts_from_args(args) # :nodoc:
|
248
271
|
Hash === args.last ? args.pop : {}
|
249
272
|
end
|
250
273
|
|
251
274
|
# :api: private
|
252
|
-
def
|
253
|
-
|
275
|
+
def silence_missing_strategies? # :nodoc:
|
276
|
+
@config[:silence_missing_strategies]
|
277
|
+
end
|
278
|
+
|
279
|
+
# :api: private
|
280
|
+
def silence_missing_serializers? # :nodoc:
|
281
|
+
@config[:silence_missing_serializers]
|
282
|
+
end
|
283
|
+
|
284
|
+
# Does the work of storing the user in stores.
|
285
|
+
# :api: private
|
286
|
+
def _store_user(user, scope = :default) # :nodoc:
|
287
|
+
return unless user
|
288
|
+
serializers.each { |s| s.store(user, scope) }
|
289
|
+
end
|
290
|
+
|
291
|
+
# Does the work of fetching the user from the first store.
|
292
|
+
# :api: private
|
293
|
+
def _fetch_user(scope = :default) # :nodoc:
|
294
|
+
serializers.each do |s|
|
295
|
+
user = s.fetch(scope)
|
296
|
+
return user if user
|
297
|
+
end
|
298
|
+
nil
|
299
|
+
end
|
300
|
+
|
301
|
+
# Does the work of deleteing the user in all stores.
|
302
|
+
# :api: private
|
303
|
+
def _delete_user(user, scope = :default) # :nodoc:
|
304
|
+
serializers.each { |s| s.delete(scope, user) }
|
305
|
+
end
|
306
|
+
|
307
|
+
# :api: private
|
308
|
+
def find_serializer(name) # :nodoc:
|
309
|
+
serializers.find { |s| s.class == ::Warden::Serializers[name] }
|
254
310
|
end
|
255
311
|
end # Proxy
|
256
312
|
end # Warden
|