devise_active_directory_authenticatable 0.1.0
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/MIT-LICENSE +20 -0
- data/README.md +94 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/ad_auth.sublime.proj +315 -0
- data/devise_active_directory_authenticatable.gemspec +53 -0
- data/lib/devise_active_directory_authenticatable.rb +54 -0
- data/lib/devise_active_directory_authenticatable/exception.rb +6 -0
- data/lib/devise_active_directory_authenticatable/logger.rb +11 -0
- data/lib/devise_active_directory_authenticatable/model.rb +124 -0
- data/lib/devise_active_directory_authenticatable/strategy.rb +37 -0
- data/lib/generators/devise_active_directory_authenticatable/install_generator.rb +74 -0
- data/rails/init.rb +2 -0
- metadata +110 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Adam Kerr
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
Devise Active Directory Authenticatable
|
2
|
+
===========================
|
3
|
+
|
4
|
+
Devise ActiveDirectory Authenticatable is a AD based authentication strategy for the [Devise](http://github.com/plataformatec/devise) authentication framework.
|
5
|
+
|
6
|
+
If you are building applications for use within your organization which require authentication and you want to use AD, this plugin is for you.
|
7
|
+
|
8
|
+
Requirements
|
9
|
+
------------
|
10
|
+
|
11
|
+
- An Active Directory server (tested on Server 2008)
|
12
|
+
- Rails 3.0.0
|
13
|
+
|
14
|
+
These gems are dependencies of the gem:
|
15
|
+
|
16
|
+
- Devise 1.1.2
|
17
|
+
- active_directory 1.0.4 from http://github.com/ajrkerr/activedirectory
|
18
|
+
|
19
|
+
Installation
|
20
|
+
------------
|
21
|
+
|
22
|
+
**_Please Note_**
|
23
|
+
|
24
|
+
This will *only* work for Rails 3 applications.
|
25
|
+
|
26
|
+
In the Gemfile for your application:
|
27
|
+
|
28
|
+
gem "devise", ">=1.1.2"
|
29
|
+
gem "devise_active_directory_authenticatable"
|
30
|
+
|
31
|
+
To get the latest version, pull directly from github instead of the gem:
|
32
|
+
|
33
|
+
gem "devise_active_directory_authenticatable", :git => "git://github.com/ajrkerr/devise_active_directory_authenticatable.git"
|
34
|
+
|
35
|
+
|
36
|
+
Setup
|
37
|
+
-----
|
38
|
+
|
39
|
+
Run the rails generators for devise (please check the [devise](http://github.com/plataformatec/devise) documents for further instructions)
|
40
|
+
|
41
|
+
rails generate devise:install
|
42
|
+
rails generate devise MODEL_NAME
|
43
|
+
|
44
|
+
Run the rails generator for devise_active_directory_authenticatable
|
45
|
+
|
46
|
+
rails generate devise_active_directory_authenticatable:install [options]
|
47
|
+
|
48
|
+
This will update the devise.rb initializer, and update your user model. There are some options you can pass to it:
|
49
|
+
|
50
|
+
Options:
|
51
|
+
|
52
|
+
[--user-model=USER_MODEL] # Model to update
|
53
|
+
# Default: user
|
54
|
+
[--add-rescue] # Update Application Controller with resuce_from for DeviseActiveDirectoryAuthenticatable::ActiveDirectoryException
|
55
|
+
# Default: true
|
56
|
+
|
57
|
+
|
58
|
+
Usage
|
59
|
+
-----
|
60
|
+
|
61
|
+
**_Please Note_**
|
62
|
+
|
63
|
+
This devise plugin has not been tested with DatabaseAuthenticatable enabled at the same time. This is meant as a drop in replacement for DatabaseAuthenticatable allowing for a semi single sign on approach.
|
64
|
+
|
65
|
+
The field that is used for logins is the first key that's configured in the `config/devise.rb` file under `config.authentication_keys`, which by default is email. For help changing this, please see the [Railscast](http://railscasts.com/episodes/210-customizing-devise) that goes through how to customize Devise.
|
66
|
+
|
67
|
+
Configuration
|
68
|
+
-------------
|
69
|
+
|
70
|
+
In initializer `config/initializers/devise.rb` :
|
71
|
+
|
72
|
+
* ad\_settigns
|
73
|
+
* Active Directory server configuration settings
|
74
|
+
|
75
|
+
* ad\_attr\_mapping
|
76
|
+
* Attribute mapping between active directory and the user model
|
77
|
+
|
78
|
+
* ad\_username _(default: :userPrincipalName)_
|
79
|
+
* Username attribute on the AD to login with. Maps with the login_with attribute from devise.
|
80
|
+
|
81
|
+
* ad\_create\_user _(default: true)_
|
82
|
+
* If set to true, all valid Active Directory users will be allowed to login and an appropriate user record will be created.
|
83
|
+
If set to false, you will have to create the user record before they will be allowed to login.
|
84
|
+
|
85
|
+
* ad\_logger _(default: true)_
|
86
|
+
* If set to true, will log Active Directory queries to the Rails logger.
|
87
|
+
|
88
|
+
|
89
|
+
References
|
90
|
+
----------
|
91
|
+
|
92
|
+
* [Devise](http://github.com/plataformatec/devise)
|
93
|
+
* [Warden](http://github.com/hassox/warden)
|
94
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the devise_imapable plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
# t.libs << 'lib'
|
11
|
+
# t.libs << 'test'
|
12
|
+
# t.pattern = 'test/**/*_test.rb'
|
13
|
+
# t.verbose = true
|
14
|
+
puts <<-eof
|
15
|
+
|
16
|
+
*** NOTICE ***
|
17
|
+
|
18
|
+
All tests are done in the sample Rails app.
|
19
|
+
|
20
|
+
Please go to test/rails_app and run the tests there.
|
21
|
+
|
22
|
+
Make sure to bundle install and rake db:migrate
|
23
|
+
|
24
|
+
eof
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Generate documentation for the devise_ldap_authenticatable plugin.'
|
28
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
29
|
+
rdoc.rdoc_dir = 'rdoc'
|
30
|
+
rdoc.title = 'DeviseLDAPAuthenticatable'
|
31
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
32
|
+
rdoc.rdoc_files.include('README')
|
33
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
begin
|
38
|
+
require 'jeweler'
|
39
|
+
Jeweler::Tasks.new do |gemspec|
|
40
|
+
gemspec.name = "devise_active_directory_authenticatable"
|
41
|
+
gemspec.summary = "Active Directory authentication module for Devise"
|
42
|
+
gemspec.description = "Active Directory authentication module for Devise, based off of LDAP Authentication"
|
43
|
+
gemspec.email = "ajrkerr@gmail.com"
|
44
|
+
gemspec.homepage = "http://github.com/ajrkerr/devise_activedirectory_authenticatable"
|
45
|
+
gemspec.authors = ["Adam Kerr"]
|
46
|
+
gemspec.add_dependency "devise", ">= 1.1.5"
|
47
|
+
gemspec.add_dependency "activedirectory", ">= 1.0.4"
|
48
|
+
end
|
49
|
+
Jeweler::GemcutterTasks.new
|
50
|
+
rescue LoadError
|
51
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
52
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,315 @@
|
|
1
|
+
{
|
2
|
+
"buffers":
|
3
|
+
[
|
4
|
+
{
|
5
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable/model.rb",
|
6
|
+
"settings":
|
7
|
+
{
|
8
|
+
"buffer_size": 3917,
|
9
|
+
"line_ending": "Unix"
|
10
|
+
}
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/Rakefile",
|
14
|
+
"settings":
|
15
|
+
{
|
16
|
+
"buffer_size": 1525,
|
17
|
+
"line_ending": "Unix"
|
18
|
+
}
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable.rb",
|
22
|
+
"settings":
|
23
|
+
{
|
24
|
+
"buffer_size": 2719,
|
25
|
+
"line_ending": "Unix"
|
26
|
+
}
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"file": "/Users/ajrkerr/test3.rb",
|
30
|
+
"settings":
|
31
|
+
{
|
32
|
+
"buffer_size": 1404,
|
33
|
+
"line_ending": "Unix"
|
34
|
+
}
|
35
|
+
},
|
36
|
+
{
|
37
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable/strategy.rb",
|
38
|
+
"settings":
|
39
|
+
{
|
40
|
+
"buffer_size": 1196,
|
41
|
+
"line_ending": "Unix"
|
42
|
+
}
|
43
|
+
}
|
44
|
+
],
|
45
|
+
"build_system": "",
|
46
|
+
"file_history":
|
47
|
+
[
|
48
|
+
"/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable/schema.rb",
|
49
|
+
"/Users/ajrkerr/test.rb",
|
50
|
+
"/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable/logger.rb",
|
51
|
+
"/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable/model.rb",
|
52
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_active_directory_authenticatable.rb",
|
53
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_active_directory_authenticatable/model.rb",
|
54
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_activedirectory_authenticatable/model.rb",
|
55
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_activedirectory_authenticatable/exception.rb",
|
56
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_activedirectory_authenticatable/strategy.rb",
|
57
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/Rakefile",
|
58
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/devise_activedirectory_authenticatable.gemspec",
|
59
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_activedirectory_authenticatable.rb",
|
60
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/rails/init.rb",
|
61
|
+
"/Users/ajrkerr/test4.rb",
|
62
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_ldap_authenticatable/strategy.rb",
|
63
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_ldap_authenticatable.rb",
|
64
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_ldap_authenticatable/ldap_adapter.rb",
|
65
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/MIT-LICENSE",
|
66
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/devise_ldap_authenticatable.gemspec",
|
67
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_ldap_authenticatable/logger.rb",
|
68
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_ldap_authenticatable/exception.rb",
|
69
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_ldap_authenticatable/model.rb",
|
70
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/lib/devise_ldap_authenticatable/version.rb",
|
71
|
+
"/Users/ajrkerr/github/devise_activedirectory_authenticatable/VERSION"
|
72
|
+
],
|
73
|
+
"find_in_files":
|
74
|
+
{
|
75
|
+
"include_history":
|
76
|
+
[
|
77
|
+
""
|
78
|
+
],
|
79
|
+
"location_history":
|
80
|
+
[
|
81
|
+
"<open folders>"
|
82
|
+
]
|
83
|
+
},
|
84
|
+
"find_state":
|
85
|
+
{
|
86
|
+
"case_sensitive": false,
|
87
|
+
"find_history":
|
88
|
+
[
|
89
|
+
"strategy",
|
90
|
+
"ldap",
|
91
|
+
"devise_active",
|
92
|
+
"ActiveDirectoryAuthenticatable",
|
93
|
+
"deviseadauthenti",
|
94
|
+
"DeviseLdapAuthenticatable"
|
95
|
+
],
|
96
|
+
"highlight": true,
|
97
|
+
"in_selection": false,
|
98
|
+
"preserve_case": false,
|
99
|
+
"regex": false,
|
100
|
+
"replace_history":
|
101
|
+
[
|
102
|
+
"DeviseActiveDirectoryAuthenticatable"
|
103
|
+
],
|
104
|
+
"reverse": false,
|
105
|
+
"show_context": true,
|
106
|
+
"use_buffer": false,
|
107
|
+
"whole_word": false,
|
108
|
+
"wrap": true
|
109
|
+
},
|
110
|
+
"folders":
|
111
|
+
{
|
112
|
+
"mount_points":
|
113
|
+
[
|
114
|
+
"/Users/ajrkerr/github/devise_active_directory_authenticatable"
|
115
|
+
]
|
116
|
+
},
|
117
|
+
"groups":
|
118
|
+
[
|
119
|
+
{
|
120
|
+
"selected": 0,
|
121
|
+
"sheets":
|
122
|
+
[
|
123
|
+
{
|
124
|
+
"buffer": 0,
|
125
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable/model.rb",
|
126
|
+
"settings":
|
127
|
+
{
|
128
|
+
"buffer_size": 3917,
|
129
|
+
"regions":
|
130
|
+
{
|
131
|
+
},
|
132
|
+
"selection":
|
133
|
+
[
|
134
|
+
[
|
135
|
+
883,
|
136
|
+
883
|
137
|
+
]
|
138
|
+
],
|
139
|
+
"settings":
|
140
|
+
{
|
141
|
+
"syntax": "Packages/Ruby/Ruby.tmLanguage",
|
142
|
+
"tab_size": 2,
|
143
|
+
"translate_tabs_to_spaces": true
|
144
|
+
},
|
145
|
+
"translation.x": 0,
|
146
|
+
"translation.y": 1007,
|
147
|
+
"zoom_level": 1
|
148
|
+
},
|
149
|
+
"type": "text"
|
150
|
+
},
|
151
|
+
{
|
152
|
+
"buffer": 1,
|
153
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/Rakefile",
|
154
|
+
"settings":
|
155
|
+
{
|
156
|
+
"buffer_size": 1525,
|
157
|
+
"regions":
|
158
|
+
{
|
159
|
+
},
|
160
|
+
"selection":
|
161
|
+
[
|
162
|
+
[
|
163
|
+
366,
|
164
|
+
366
|
165
|
+
]
|
166
|
+
],
|
167
|
+
"settings":
|
168
|
+
{
|
169
|
+
"syntax": "Packages/Ruby/Ruby.tmLanguage",
|
170
|
+
"tab_size": 2,
|
171
|
+
"translate_tabs_to_spaces": true
|
172
|
+
},
|
173
|
+
"translation.x": 0,
|
174
|
+
"translation.y": 19,
|
175
|
+
"zoom_level": 1
|
176
|
+
},
|
177
|
+
"type": "text"
|
178
|
+
}
|
179
|
+
]
|
180
|
+
},
|
181
|
+
{
|
182
|
+
"selected": 0,
|
183
|
+
"sheets":
|
184
|
+
[
|
185
|
+
{
|
186
|
+
"buffer": 2,
|
187
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable.rb",
|
188
|
+
"settings":
|
189
|
+
{
|
190
|
+
"buffer_size": 2719,
|
191
|
+
"regions":
|
192
|
+
{
|
193
|
+
},
|
194
|
+
"selection":
|
195
|
+
[
|
196
|
+
[
|
197
|
+
705,
|
198
|
+
705
|
199
|
+
]
|
200
|
+
],
|
201
|
+
"settings":
|
202
|
+
{
|
203
|
+
"syntax": "Packages/Ruby/Ruby.tmLanguage",
|
204
|
+
"tab_size": 2,
|
205
|
+
"translate_tabs_to_spaces": true
|
206
|
+
},
|
207
|
+
"translation.x": 0,
|
208
|
+
"translation.y": 0,
|
209
|
+
"zoom_level": 1
|
210
|
+
},
|
211
|
+
"type": "text"
|
212
|
+
},
|
213
|
+
{
|
214
|
+
"buffer": 3,
|
215
|
+
"file": "/Users/ajrkerr/test3.rb",
|
216
|
+
"settings":
|
217
|
+
{
|
218
|
+
"buffer_size": 1404,
|
219
|
+
"regions":
|
220
|
+
{
|
221
|
+
},
|
222
|
+
"selection":
|
223
|
+
[
|
224
|
+
[
|
225
|
+
754,
|
226
|
+
754
|
227
|
+
]
|
228
|
+
],
|
229
|
+
"settings":
|
230
|
+
{
|
231
|
+
"syntax": "Packages/Ruby/Ruby.tmLanguage",
|
232
|
+
"tab_size": 2,
|
233
|
+
"translate_tabs_to_spaces": true
|
234
|
+
},
|
235
|
+
"translation.x": 0,
|
236
|
+
"translation.y": 0,
|
237
|
+
"zoom_level": 1
|
238
|
+
},
|
239
|
+
"type": "text"
|
240
|
+
},
|
241
|
+
{
|
242
|
+
"buffer": 4,
|
243
|
+
"file": "/Users/ajrkerr/github/devise_active_directory_authenticatable/lib/devise_active_directory_authenticatable/strategy.rb",
|
244
|
+
"settings":
|
245
|
+
{
|
246
|
+
"buffer_size": 1196,
|
247
|
+
"regions":
|
248
|
+
{
|
249
|
+
},
|
250
|
+
"selection":
|
251
|
+
[
|
252
|
+
[
|
253
|
+
738,
|
254
|
+
738
|
255
|
+
]
|
256
|
+
],
|
257
|
+
"settings":
|
258
|
+
{
|
259
|
+
"syntax": "Packages/Ruby/Ruby.tmLanguage",
|
260
|
+
"tab_size": 2,
|
261
|
+
"translate_tabs_to_spaces": true
|
262
|
+
},
|
263
|
+
"translation.x": 0,
|
264
|
+
"translation.y": 0,
|
265
|
+
"zoom_level": 1
|
266
|
+
},
|
267
|
+
"type": "text"
|
268
|
+
}
|
269
|
+
]
|
270
|
+
}
|
271
|
+
],
|
272
|
+
"layout":
|
273
|
+
{
|
274
|
+
"cells":
|
275
|
+
[
|
276
|
+
[
|
277
|
+
0,
|
278
|
+
0,
|
279
|
+
1,
|
280
|
+
1
|
281
|
+
],
|
282
|
+
[
|
283
|
+
1,
|
284
|
+
0,
|
285
|
+
2,
|
286
|
+
1
|
287
|
+
]
|
288
|
+
],
|
289
|
+
"cols":
|
290
|
+
[
|
291
|
+
0,
|
292
|
+
0.489053,
|
293
|
+
1
|
294
|
+
],
|
295
|
+
"rows":
|
296
|
+
[
|
297
|
+
0,
|
298
|
+
1
|
299
|
+
]
|
300
|
+
},
|
301
|
+
"save_all_on_build": true,
|
302
|
+
"select_file":
|
303
|
+
{
|
304
|
+
"height": 0,
|
305
|
+
"selected_items":
|
306
|
+
[
|
307
|
+
],
|
308
|
+
"width": 0
|
309
|
+
},
|
310
|
+
"show_minimap": false,
|
311
|
+
"show_tabs": true,
|
312
|
+
"side_bar_visible": true,
|
313
|
+
"side_bar_width": 132,
|
314
|
+
"status_bar_visible": true
|
315
|
+
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{devise_active_directory_authenticatable}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Adam Kerr"]
|
12
|
+
s.date = %q{2011-02-10}
|
13
|
+
s.description = %q{Active Directory authentication module for Devise, based off of LDAP Authentication}
|
14
|
+
s.email = %q{ajrkerr@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"MIT-LICENSE",
|
20
|
+
"README.md",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"ad_auth.sublime.proj",
|
24
|
+
"devise_active_directory_authenticatable.gemspec",
|
25
|
+
"lib/devise_active_directory_authenticatable.rb",
|
26
|
+
"lib/devise_active_directory_authenticatable/exception.rb",
|
27
|
+
"lib/devise_active_directory_authenticatable/logger.rb",
|
28
|
+
"lib/devise_active_directory_authenticatable/model.rb",
|
29
|
+
"lib/devise_active_directory_authenticatable/strategy.rb",
|
30
|
+
"lib/generators/devise_active_directory_authenticatable/install_generator.rb",
|
31
|
+
"rails/init.rb"
|
32
|
+
]
|
33
|
+
s.homepage = %q{http://github.com/ajrkerr/devise_activedirectory_authenticatable}
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
s.rubygems_version = %q{1.5.0}
|
36
|
+
s.summary = %q{Active Directory authentication module for Devise}
|
37
|
+
|
38
|
+
if s.respond_to? :specification_version then
|
39
|
+
s.specification_version = 3
|
40
|
+
|
41
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
42
|
+
s.add_runtime_dependency(%q<devise>, [">= 1.1.5"])
|
43
|
+
s.add_runtime_dependency(%q<activedirectory>, [">= 1.0.4"])
|
44
|
+
else
|
45
|
+
s.add_dependency(%q<devise>, [">= 1.1.5"])
|
46
|
+
s.add_dependency(%q<activedirectory>, [">= 1.0.4"])
|
47
|
+
end
|
48
|
+
else
|
49
|
+
s.add_dependency(%q<devise>, [">= 1.1.5"])
|
50
|
+
s.add_dependency(%q<activedirectory>, [">= 1.0.4"])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'devise'
|
3
|
+
require 'active_directory'
|
4
|
+
|
5
|
+
require 'devise_active_directory_authenticatable/exception'
|
6
|
+
require 'devise_active_directory_authenticatable/logger'
|
7
|
+
|
8
|
+
# Get ldap information from config/ldap.yml now
|
9
|
+
module Devise
|
10
|
+
|
11
|
+
##TODO Revise these options/vars and their corresponding generator
|
12
|
+
|
13
|
+
#Active Directory settings
|
14
|
+
mattr_accessor :ad_settings
|
15
|
+
@@ad_settings = {
|
16
|
+
:host => 'domain-controller.example.local',
|
17
|
+
:base => 'dc=example,dc=local',
|
18
|
+
:port => 636,
|
19
|
+
:encryption => :simple_tls,
|
20
|
+
:auth => {
|
21
|
+
:method => :simple
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
#Attribute mapping for user object
|
26
|
+
mattr_accessor :ad_attr_mapping
|
27
|
+
@@ad_attr_mapping = {
|
28
|
+
:objectGUID => :objectGUID, #Required
|
29
|
+
:username => :userPrincipalName,
|
30
|
+
:dn => :dn,
|
31
|
+
:firstname => :givenName,
|
32
|
+
:lastname => :sn,
|
33
|
+
}
|
34
|
+
|
35
|
+
#Username attribute
|
36
|
+
mattr_accessor :ad_username
|
37
|
+
@@ad_username = :userPrincipalName
|
38
|
+
|
39
|
+
#Create the user if they're not found
|
40
|
+
mattr_accessor :ad_create_user
|
41
|
+
@@ad_create_user = true
|
42
|
+
|
43
|
+
# Log LDAP queries to the Rails logger
|
44
|
+
mattr_accessor :ad_logger
|
45
|
+
@@ad_logger = true
|
46
|
+
end
|
47
|
+
|
48
|
+
# Add ldap_authenticatable strategy to defaults.
|
49
|
+
#
|
50
|
+
Devise.add_module(:ad_user,
|
51
|
+
:route => :session, ## This will add the routes, rather than in the routes.rb
|
52
|
+
:strategy => true,
|
53
|
+
:controller => :sessions,
|
54
|
+
:model => 'devise_active_directory_authenticatable/model')
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'devise_active_directory_authenticatable/strategy'
|
2
|
+
require 'devise_active_directory_authenticatable/exception'
|
3
|
+
|
4
|
+
module Devise
|
5
|
+
module Models
|
6
|
+
# Active Directory Module, responsible for validating the user credentials via Active Directory
|
7
|
+
#
|
8
|
+
module AdUser
|
9
|
+
|
10
|
+
#Remove this before production
|
11
|
+
ADConnect = DeviseActiveDirectoryAuthenticatable
|
12
|
+
ADUser = ActiveDirectory::User
|
13
|
+
Logger = DeviseActiveDirectoryAuthenticatable::Logger
|
14
|
+
|
15
|
+
extend ActiveSupport::Concern
|
16
|
+
|
17
|
+
included do
|
18
|
+
serialize :objectGUID
|
19
|
+
end
|
20
|
+
|
21
|
+
## Devise key
|
22
|
+
def login_with
|
23
|
+
self[::Devise.authentication_keys.first]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Update the attributes of the current object from the AD
|
27
|
+
# Defaults to current user if no parameters given
|
28
|
+
def sync_with_activedirectory(params = {})
|
29
|
+
params[:objectGUID] = self.objectGUID if params.empty?
|
30
|
+
user = params[:user] || User.find_in_activedirectory(params)
|
31
|
+
|
32
|
+
return false if user.nil?
|
33
|
+
|
34
|
+
Logger.send "Updating #{params.inspect}"
|
35
|
+
|
36
|
+
#Grab attributes from Devise mapping
|
37
|
+
::Devise.ad_attr_mapping.each do |user_attr, active_directory_attr|
|
38
|
+
self[user_attr] = user.send(active_directory_attr)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Login event handler. Triggered after authentication.
|
43
|
+
def login
|
44
|
+
sync_with_activedirectory
|
45
|
+
super if defined? super
|
46
|
+
end
|
47
|
+
|
48
|
+
def guid
|
49
|
+
objectGUID.unpack("H*")
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
module ClassMethods
|
54
|
+
|
55
|
+
# Authenticate a user based on configured attribute keys. Returns the
|
56
|
+
# authenticated user if it's valid or nil.
|
57
|
+
def authenticate_with_activedirectory(attributes={})
|
58
|
+
@login_with = ::Devise.authentication_keys.first
|
59
|
+
|
60
|
+
username = attributes[@login_with]
|
61
|
+
password = attributes[:password]
|
62
|
+
|
63
|
+
raise ADConnect::ActiveDirectoryException, "Annonymous binds are not permitted." unless attributes[@login_with].present?
|
64
|
+
|
65
|
+
Logger.send "Attempting to login :#{@login_with} => #{username}"
|
66
|
+
ad_connect(:username => username, :password => password)
|
67
|
+
ad_user = find_in_activedirectory(:username => username)
|
68
|
+
Logger.send "Attempt Result: #{ActiveDirectory::Base.error}"
|
69
|
+
|
70
|
+
raise ADConnect::ActiveDirectoryException, "Could not connect with Active Directory. Check your username, password, and ensure that your account is not locked." unless ad_user
|
71
|
+
|
72
|
+
# Find them in the local database
|
73
|
+
user = scoped.where(@login_with => attributes[@login_with]).first
|
74
|
+
|
75
|
+
if user.blank? and ::Devise.ad_create_user
|
76
|
+
Logger.send "Creating new user in database"
|
77
|
+
user = new
|
78
|
+
user[@login_with] = attributes[@login_with]
|
79
|
+
user.sync_with_activedirectory(:user => ad_user)
|
80
|
+
Logger.send "Created: #{user.inspect}"
|
81
|
+
end
|
82
|
+
|
83
|
+
Logger.send "Checking: #{ad_user.objectGUID} == #{user.objectGUID}"
|
84
|
+
# Check to see if we have the same user
|
85
|
+
if ad_user == user
|
86
|
+
user.save if user.new_record?
|
87
|
+
user.login if user.respond_to?(:login)
|
88
|
+
return user
|
89
|
+
else
|
90
|
+
raise ADConnect::ActiveDirectoryException, "Invalid Username or Password. Possible database inconsistency."
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
#Search based on GUID, DN or Username primarily
|
96
|
+
def find_in_activedirectory(params = {})
|
97
|
+
|
98
|
+
#Reverse mappings
|
99
|
+
params[::Devise.ad_username] ||= params[:username] if params[:username].present?
|
100
|
+
params[::Devise.ad_username] ||= params[@login_with] if params[@login_with].present?
|
101
|
+
|
102
|
+
params.delete(:username)
|
103
|
+
params.delete(@login_with)
|
104
|
+
|
105
|
+
Logger.send "Searching for #{params.inspect}"
|
106
|
+
user = ADUser.find(:first, params)
|
107
|
+
Logger.send "Found: #{user}"
|
108
|
+
|
109
|
+
return user
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def ad_connect(params = {})
|
115
|
+
#Used for username and password
|
116
|
+
::Devise.ad_settings[:auth].merge! params
|
117
|
+
|
118
|
+
ActiveDirectory::Base.setup(::Devise.ad_settings)
|
119
|
+
Logger.send "Connection Result: #{ActiveDirectory::Base.error}"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'devise/strategies/authenticatable'
|
2
|
+
|
3
|
+
module Devise
|
4
|
+
module Strategies
|
5
|
+
# Strategy for signing in a user based on his login and password using LDAP.
|
6
|
+
# Redirects to sign_in page if it's not authenticated
|
7
|
+
class ActiveDirectoryAuthenticatable < Authenticatable
|
8
|
+
def valid?
|
9
|
+
valid_controller? && valid_params? && mapping.to.respond_to?(:authenticate_with_activedirectory)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Authenticate a user based on login and password params, returning to warden
|
13
|
+
# success and the authenticated user if everything is okay. Otherwise redirect
|
14
|
+
# to sign in page.
|
15
|
+
def authenticate!
|
16
|
+
if resource = mapping.to.authenticate_with_activedirectory(params[scope])
|
17
|
+
success!(resource)
|
18
|
+
else
|
19
|
+
fail(:invalid)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def valid_controller?
|
26
|
+
params[:controller] == 'devise/sessions'
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid_params?
|
30
|
+
@login_with = ::Devise.authentication_keys.first
|
31
|
+
params[scope] && params[scope][@login_with].present? && params[scope][:password].present?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Warden::Strategies.add(:ad_user, Devise::Strategies::ActiveDirectoryAuthenticatable)
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module DeviseActiveDirectoryAuthenticatable
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path("../templates", __FILE__)
|
4
|
+
|
5
|
+
class_option :user_model, :type => :string, :default => "user", :desc => "Model to update"
|
6
|
+
class_option :update_model, :type => :boolean, :default => true, :desc => "Update model to change from database_authenticatable to active_directory_authenticatable"
|
7
|
+
class_option :add_rescue, :type => :boolean, :default => true, :desc => "Update Application Controller with resuce_from for DeviseActiveDirectoryAuthenticatable::ActiveDirectoryException"
|
8
|
+
|
9
|
+
|
10
|
+
def create_default_devise_settings
|
11
|
+
inject_into_file "config/initializers/devise.rb", default_devise_settings, :after => "Devise.setup do |config|\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
def update_user_model
|
15
|
+
gsub_file "app/models/#{options.user_model}.rb", /:database_authenticatable/, ":ad_user" if options.update_model?
|
16
|
+
end
|
17
|
+
|
18
|
+
def update_application_controller
|
19
|
+
inject_into_class "app/controllers/application_controller.rb", ApplicationController, rescue_from_exception if options.add_rescue?
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def default_devise_settings
|
25
|
+
settings = <<-eof
|
26
|
+
# ==> Basic Active Directory Configuration
|
27
|
+
|
28
|
+
## Active Directory server settings
|
29
|
+
# config.ad_settings = {
|
30
|
+
# :host => 'domain-controller.example.local',
|
31
|
+
# :base => 'dc=example,dc=local',
|
32
|
+
# :port => 636,
|
33
|
+
# :encryption => :simple_tls,
|
34
|
+
# :auth => {
|
35
|
+
# :method => :simple
|
36
|
+
# }
|
37
|
+
# }
|
38
|
+
|
39
|
+
##Attribute mapping for user object
|
40
|
+
# mattr_accessor :ad_attr_mapping
|
41
|
+
# config.ad_attr_mapping = {
|
42
|
+
# :objectGUID => :objectGUID, #Required
|
43
|
+
# :username => :userPrincipalName,
|
44
|
+
# :dn => :dn,
|
45
|
+
# :firstname => :givenName,
|
46
|
+
# :lastname => :sn
|
47
|
+
# }
|
48
|
+
|
49
|
+
##Username attribute
|
50
|
+
##Maps to :login_with in the devise configuration
|
51
|
+
# config.ad_username = :userPrincipalName
|
52
|
+
|
53
|
+
##Create the user if they're not found
|
54
|
+
##If this is false, you will need to create the user object before they will be allowed to login
|
55
|
+
# config.ad_create_user = true
|
56
|
+
|
57
|
+
##Log LDAP queries to the Rails logger
|
58
|
+
# config.ad_logger = true
|
59
|
+
|
60
|
+
eof
|
61
|
+
|
62
|
+
settings
|
63
|
+
end
|
64
|
+
|
65
|
+
def rescue_from_exception
|
66
|
+
<<-eof
|
67
|
+
rescue_from DeviseActiveDirectoryAuthenticatable::ActiveDirectoryException do |exception|
|
68
|
+
render :text => exception, :status => 500
|
69
|
+
end
|
70
|
+
eof
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
data/rails/init.rb
ADDED
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devise_active_directory_authenticatable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Adam Kerr
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-10 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: devise
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 25
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 1
|
33
|
+
- 5
|
34
|
+
version: 1.1.5
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: activedirectory
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 31
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 0
|
49
|
+
- 4
|
50
|
+
version: 1.0.4
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Active Directory authentication module for Devise, based off of LDAP Authentication
|
54
|
+
email: ajrkerr@gmail.com
|
55
|
+
executables: []
|
56
|
+
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files:
|
60
|
+
- README.md
|
61
|
+
files:
|
62
|
+
- MIT-LICENSE
|
63
|
+
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- VERSION
|
66
|
+
- ad_auth.sublime.proj
|
67
|
+
- devise_active_directory_authenticatable.gemspec
|
68
|
+
- lib/devise_active_directory_authenticatable.rb
|
69
|
+
- lib/devise_active_directory_authenticatable/exception.rb
|
70
|
+
- lib/devise_active_directory_authenticatable/logger.rb
|
71
|
+
- lib/devise_active_directory_authenticatable/model.rb
|
72
|
+
- lib/devise_active_directory_authenticatable/strategy.rb
|
73
|
+
- lib/generators/devise_active_directory_authenticatable/install_generator.rb
|
74
|
+
- rails/init.rb
|
75
|
+
has_rdoc: true
|
76
|
+
homepage: http://github.com/ajrkerr/devise_activedirectory_authenticatable
|
77
|
+
licenses: []
|
78
|
+
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
102
|
+
requirements: []
|
103
|
+
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 1.5.0
|
106
|
+
signing_key:
|
107
|
+
specification_version: 3
|
108
|
+
summary: Active Directory authentication module for Devise
|
109
|
+
test_files: []
|
110
|
+
|