devise_active_directory_authenticatable 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/devise_active_directory_authenticatable.gemspec +6 -6
- data/lib/devise_active_directory_authenticatable.rb +1 -1
- data/lib/devise_active_directory_authenticatable/models/ad_group.rb +6 -5
- data/lib/devise_active_directory_authenticatable/models/ad_object.rb +55 -52
- data/lib/devise_active_directory_authenticatable/models/ad_user.rb +13 -12
- data/lib/generators/devise_active_directory_authenticatable/install_generator.rb +22 -14
- metadata +8 -8
data/Rakefile
CHANGED
@@ -22,7 +22,7 @@ begin
|
|
22
22
|
gemspec.homepage = "http://github.com/ajrkerr/devise_activedirectory_authenticatable"
|
23
23
|
gemspec.authors = ["Adam Kerr"]
|
24
24
|
gemspec.add_dependency "devise", ">= 1.1.5"
|
25
|
-
gemspec.add_dependency "active_directory", ">= 1.2.
|
25
|
+
gemspec.add_dependency "active_directory", ">= 1.2.4"
|
26
26
|
end
|
27
27
|
Jeweler::GemcutterTasks.new
|
28
28
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.1
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{devise_active_directory_authenticatable}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Adam Kerr"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-22}
|
13
13
|
s.description = %q{Active Directory authentication module for Devise, based off of LDAP Authentication}
|
14
14
|
s.email = %q{ajrkerr@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
]
|
35
35
|
s.homepage = %q{http://github.com/ajrkerr/devise_activedirectory_authenticatable}
|
36
36
|
s.require_paths = ["lib"]
|
37
|
-
s.rubygems_version = %q{1.5.
|
37
|
+
s.rubygems_version = %q{1.5.2}
|
38
38
|
s.summary = %q{Active Directory authentication module for Devise}
|
39
39
|
|
40
40
|
if s.respond_to? :specification_version then
|
@@ -42,14 +42,14 @@ Gem::Specification.new do |s|
|
|
42
42
|
|
43
43
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
44
|
s.add_runtime_dependency(%q<devise>, [">= 1.1.5"])
|
45
|
-
s.add_runtime_dependency(%q<active_directory>, [">= 1.2.
|
45
|
+
s.add_runtime_dependency(%q<active_directory>, [">= 1.2.4"])
|
46
46
|
else
|
47
47
|
s.add_dependency(%q<devise>, [">= 1.1.5"])
|
48
|
-
s.add_dependency(%q<active_directory>, [">= 1.2.
|
48
|
+
s.add_dependency(%q<active_directory>, [">= 1.2.4"])
|
49
49
|
end
|
50
50
|
else
|
51
51
|
s.add_dependency(%q<devise>, [">= 1.1.5"])
|
52
|
-
s.add_dependency(%q<active_directory>, [">= 1.2.
|
52
|
+
s.add_dependency(%q<active_directory>, [">= 1.2.4"])
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -51,7 +51,7 @@ module Devise
|
|
51
51
|
#Username attribute used for logging in
|
52
52
|
#Will be automagicaly mapped to authentication_keys.first
|
53
53
|
mattr_accessor :ad_username
|
54
|
-
@@ad_username = :
|
54
|
+
@@ad_username = :userprincipalname
|
55
55
|
|
56
56
|
#Map Devise authentication key accordingly
|
57
57
|
#Does this work when initializers are set too?
|
@@ -10,16 +10,17 @@ module Devise
|
|
10
10
|
include AdObject
|
11
11
|
|
12
12
|
module ClassMethods
|
13
|
-
|
14
|
-
ActiveDirectory::Group
|
15
|
-
end
|
16
|
-
|
13
|
+
# TODO find a way to get rid of this with metaprogramming
|
17
14
|
def devise_model
|
18
15
|
AdGroup
|
19
16
|
end
|
20
17
|
|
18
|
+
def activedirectory_class
|
19
|
+
ActiveDirectory::Group
|
20
|
+
end
|
21
|
+
|
21
22
|
def sync_all
|
22
|
-
|
23
|
+
return false unless connected_to_activedirectory?
|
23
24
|
find_or_create_from_activedirectory.each do |gp|
|
24
25
|
gp.save
|
25
26
|
end
|
@@ -3,8 +3,6 @@ module Devise
|
|
3
3
|
module AdObject
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
#Constants for easy access
|
7
|
-
ADConnect = DeviseActiveDirectoryAuthenticatable
|
8
6
|
Logger = DeviseActiveDirectoryAuthenticatable::Logger
|
9
7
|
|
10
8
|
def klass
|
@@ -13,32 +11,36 @@ module Devise
|
|
13
11
|
|
14
12
|
# Update the attributes of the current object from the AD
|
15
13
|
# Defaults to current user if no parameters given
|
16
|
-
def activedirectory_sync!
|
14
|
+
def activedirectory_sync! params = {}
|
17
15
|
params[:objectguid] = self.objectguid if params.empty?
|
18
|
-
|
16
|
+
ad_obj = params[:object] || klass.find_in_activedirectory(params).first
|
17
|
+
copy_from_activedirectory ad_obj unless ad_obj.nil?
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
# Update the attributes of the current object from the AD
|
21
|
+
# Defaults to current user if no parameters given
|
22
|
+
def update_from_activedirectory! params = {}
|
23
|
+
params[:objectguid] = self.objectguid if params.empty?
|
24
|
+
ad_obj = params[:object] || klass.find_in_activedirectory(params).first
|
25
|
+
copy_from_activedirectory ad_obj unless ad_obj.nil?
|
26
|
+
end
|
22
27
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
+
# Update the local object using an Active Directory entry
|
29
|
+
def copy_from_activedirectory ad_obj
|
30
|
+
::Devise.ad_attr_mapping[klass.devise_model_name.to_sym].each do |local_attr, active_directory_attr|
|
31
|
+
self[local_attr] = ad_obj.send(active_directory_attr)
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
|
-
def
|
32
|
-
find_in_activedirectory :objectGUID => objectGUID
|
35
|
+
def find_in_activedirectory
|
36
|
+
klass.find_in_activedirectory :objectGUID => objectGUID
|
33
37
|
end
|
34
38
|
|
35
39
|
module ClassMethods
|
36
40
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
# end
|
41
|
-
# end
|
41
|
+
def login_with
|
42
|
+
::Devise.authentication_keys.first
|
43
|
+
end
|
42
44
|
|
43
45
|
def devise_model_name
|
44
46
|
devise_model.name[/.*::(.*)/, 1]
|
@@ -48,36 +50,6 @@ module Devise
|
|
48
50
|
activedirectory_class.name[/.*::(.*)/, 1]
|
49
51
|
end
|
50
52
|
|
51
|
-
#TODO switch from reverse to rassoc to allow for multiple mappings
|
52
|
-
def ad_field_to_local field_name
|
53
|
-
@ad_to_local_map ||= ::Devise.ad_attr_mapping[devise_model_name.to_sym].invert
|
54
|
-
return (@ad_to_local_map.has_key? field_name) ? @ad_to_local_map[field_name] : field_name
|
55
|
-
end
|
56
|
-
|
57
|
-
#TODO switch from reverse to rassoc to allow for multiple mappings
|
58
|
-
def local_field_to_ad field_name
|
59
|
-
@local_to_ad_map ||= ::Devise.ad_attr_mapping[devise_model_name.to_sym]
|
60
|
-
return (@local_to_ad_map.has_key? field_name) ? @local_to_ad_map[field_name] : field_name
|
61
|
-
end
|
62
|
-
|
63
|
-
def ad_attrs_to_local ad_attrs
|
64
|
-
local_attrs = {}
|
65
|
-
ad_attrs.each do |ad_key, value|
|
66
|
-
local_key = ad_field_to_local(ad_key)
|
67
|
-
local_attrs[local_key] = value
|
68
|
-
end
|
69
|
-
local_attrs
|
70
|
-
end
|
71
|
-
|
72
|
-
def local_attrs_to_ad local_attrs
|
73
|
-
ad_attrs = {}
|
74
|
-
local_attrs.each do |local_key, value|
|
75
|
-
ad_key = local_field_to_ad(local_key)
|
76
|
-
ad_attrs[ad_key] = value
|
77
|
-
end
|
78
|
-
ad_attrs
|
79
|
-
end
|
80
|
-
|
81
53
|
#Search based on GUID, DN or Username primarily
|
82
54
|
def find_in_activedirectory(local_params = {})
|
83
55
|
#Reverse mappings for user
|
@@ -85,9 +57,7 @@ module Devise
|
|
85
57
|
|
86
58
|
return find_all_in_activedirectory if ad_params.empty?
|
87
59
|
|
88
|
-
|
89
|
-
|
90
|
-
return ad_objs
|
60
|
+
activedirectory_class.find(:all, ad_params)
|
91
61
|
end
|
92
62
|
|
93
63
|
def find_or_create_from_activedirectory params = {}
|
@@ -122,8 +92,41 @@ module Devise
|
|
122
92
|
|
123
93
|
def activedirectory_connect
|
124
94
|
ActiveDirectory::Base.setup(::Devise.ad_settings)
|
125
|
-
raise DeviseActiveDirectoryAuthenticatable::ActiveDirectoryException, "
|
95
|
+
raise DeviseActiveDirectoryAuthenticatable::ActiveDirectoryException, "Invalid Username or Password" unless ActiveDirectory::Base.connected?
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
#TODO switch from reverse to rassoc to allow for multiple mappings
|
101
|
+
def ad_field_to_local field_name
|
102
|
+
@ad_to_local_map ||= ::Devise.ad_attr_mapping[devise_model_name.to_sym].invert
|
103
|
+
return (@ad_to_local_map.has_key? field_name) ? @ad_to_local_map[field_name] : field_name
|
126
104
|
end
|
105
|
+
|
106
|
+
#TODO switch from reverse to rassoc to allow for multiple mappings
|
107
|
+
def local_field_to_ad field_name
|
108
|
+
@local_to_ad_map ||= ::Devise.ad_attr_mapping[devise_model_name.to_sym]
|
109
|
+
return (@local_to_ad_map.has_key? field_name) ? @local_to_ad_map[field_name] : field_name
|
110
|
+
end
|
111
|
+
|
112
|
+
def ad_attrs_to_local ad_attrs
|
113
|
+
local_attrs = {}
|
114
|
+
ad_attrs.each do |ad_key, value|
|
115
|
+
local_key = ad_field_to_local(ad_key)
|
116
|
+
local_attrs[local_key] = value
|
117
|
+
end
|
118
|
+
local_attrs
|
119
|
+
end
|
120
|
+
|
121
|
+
def local_attrs_to_ad local_attrs
|
122
|
+
ad_attrs = {}
|
123
|
+
local_attrs.each do |local_key, value|
|
124
|
+
ad_key = local_field_to_ad(local_key)
|
125
|
+
ad_attrs[ad_key] = value
|
126
|
+
end
|
127
|
+
ad_attrs
|
128
|
+
end
|
129
|
+
|
127
130
|
end
|
128
131
|
end
|
129
132
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'devise_active_directory_authenticatable/strategy'
|
2
2
|
require 'devise_active_directory_authenticatable/exception'
|
3
3
|
require 'devise_active_directory_authenticatable/models/ad_object'
|
4
|
-
require 'devise_active_directory_authenticatable/models/ad_group'
|
5
4
|
|
6
5
|
module Devise
|
7
6
|
module Models
|
@@ -13,6 +12,10 @@ module Devise
|
|
13
12
|
|
14
13
|
Logger = DeviseActiveDirectoryAuthenticatable::Logger
|
15
14
|
|
15
|
+
included do
|
16
|
+
|
17
|
+
end
|
18
|
+
|
16
19
|
## Devise key
|
17
20
|
def login_with
|
18
21
|
self[::Devise.authentication_keys.first]
|
@@ -26,26 +29,25 @@ module Devise
|
|
26
29
|
end
|
27
30
|
|
28
31
|
def authenticate_with_activedirectory params = {}
|
29
|
-
params[:username] ||=
|
30
|
-
set_activedirectory_credentials params
|
31
|
-
activedirectory_connect
|
32
|
+
params[:username] ||= login_with
|
33
|
+
self.class.set_activedirectory_credentials params
|
34
|
+
self.class.activedirectory_connect
|
32
35
|
end
|
33
36
|
|
34
37
|
module ClassMethods
|
35
|
-
|
36
|
-
ActiveDirectory::User
|
37
|
-
end
|
38
|
-
|
38
|
+
# TODO find a way to get rid of this with metaprogramming
|
39
39
|
def devise_model
|
40
40
|
AdUser
|
41
41
|
end
|
42
42
|
|
43
|
+
def activedirectory_class
|
44
|
+
ActiveDirectory::User
|
45
|
+
end
|
46
|
+
|
43
47
|
# Authenticate a user based on configured attribute keys. Returns the
|
44
48
|
# authenticated user if it's valid or nil.
|
45
49
|
def authenticate_with_activedirectory(attributes={})
|
46
|
-
|
47
|
-
|
48
|
-
username = attributes[@login_with]
|
50
|
+
username = attributes[login_with]
|
49
51
|
password = attributes[:password]
|
50
52
|
|
51
53
|
Logger.send "Attempting to login :#{@login_with} => #{username}"
|
@@ -59,7 +61,6 @@ module Devise
|
|
59
61
|
|
60
62
|
# Find them in the local database
|
61
63
|
user = find_or_create_from_activedirectory(@login_with => attributes[@login_with]).first
|
62
|
-
Logger.send "User: #{user.inspect}"
|
63
64
|
|
64
65
|
# Check to see if we have the same user
|
65
66
|
unless user.nil?
|
@@ -37,24 +37,32 @@ module DeviseActiveDirectoryAuthenticatable
|
|
37
37
|
# }
|
38
38
|
|
39
39
|
|
40
|
+
# config.ad_attr_mapping = {
|
40
41
|
##Attribute mapping for user object
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
42
|
+
# :AdUser => {
|
43
|
+
# #Attributes are lowercase
|
44
|
+
# :objectguid => :objectguid, #Required
|
45
|
+
# :username => :userprincipalname,
|
46
|
+
# :dn => :dn,
|
47
|
+
# :firstname => :givenName,
|
48
|
+
# :lastname => :sn,
|
49
|
+
# :whenchanged => :whenchanged,
|
50
|
+
# :whencreated => :whencreated,
|
51
|
+
# },
|
48
52
|
|
49
|
-
|
50
|
-
# :
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
53
|
+
##Attribute mapping for group objects
|
54
|
+
# :AdGroup => {
|
55
|
+
# #Attributes are lowercase
|
56
|
+
# :objectguid => :objectguid, #Required
|
57
|
+
# :dn => :dn,
|
58
|
+
# :name => :name,
|
59
|
+
# :description => :description,
|
60
|
+
# :whencreated => :whencreated,
|
61
|
+
# :whenchanged => :whenchanged,
|
62
|
+
# }
|
56
63
|
# }
|
57
64
|
|
65
|
+
|
58
66
|
##Username attribute
|
59
67
|
##Maps to :login_with in the devise configuration
|
60
68
|
# config.ad_username = :userPrincipalName
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise_active_directory_authenticatable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Adam Kerr
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-22 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -42,12 +42,12 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ">="
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
45
|
+
hash: 23
|
46
46
|
segments:
|
47
47
|
- 1
|
48
48
|
- 2
|
49
|
-
-
|
50
|
-
version: 1.2.
|
49
|
+
- 4
|
50
|
+
version: 1.2.4
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
53
|
description: Active Directory authentication module for Devise, based off of LDAP Authentication
|
@@ -104,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
104
|
requirements: []
|
105
105
|
|
106
106
|
rubyforge_project:
|
107
|
-
rubygems_version: 1.5.
|
107
|
+
rubygems_version: 1.5.2
|
108
108
|
signing_key:
|
109
109
|
specification_version: 3
|
110
110
|
summary: Active Directory authentication module for Devise
|