devise_ldap_authenticatable 0.6.1 → 0.7.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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -4
- data/README.md +45 -92
- data/Rakefile +8 -7
- data/devise_ldap_authenticatable.gemspec +15 -3
- data/lib/devise_ldap_authenticatable/ldap_adapter.rb +51 -27
- data/lib/devise_ldap_authenticatable/model.rb +5 -1
- data/lib/devise_ldap_authenticatable/strategy.rb +3 -1
- data/lib/devise_ldap_authenticatable/version.rb +1 -1
- data/lib/generators/devise_ldap_authenticatable/templates/ldap.yml +3 -3
- data/spec/ldap/.gitignore +2 -0
- data/{test → spec}/ldap/base.ldif +0 -0
- data/{test → spec}/ldap/clear.ldif +0 -0
- data/{test → spec}/ldap/local.schema +0 -0
- data/spec/ldap/openldap-data/.gitignore +2 -0
- data/spec/ldap/openldap-data/run/.gitignore +2 -0
- data/{test → spec}/ldap/openldap-data/run/.gitkeep +0 -0
- data/spec/ldap/run-server +31 -0
- data/{test → spec}/ldap/server.pem +0 -0
- data/{test/ldap/slapd-test.conf → spec/ldap/slapd-test.conf.erb} +16 -16
- data/{test → spec}/rails_app/Rakefile +0 -0
- data/spec/rails_app/app/controllers/application_controller.rb +7 -0
- data/{test → spec}/rails_app/app/controllers/posts_controller.rb +0 -0
- data/{test → spec}/rails_app/app/helpers/application_helper.rb +0 -0
- data/{test → spec}/rails_app/app/helpers/posts_helper.rb +0 -0
- data/{test → spec}/rails_app/app/models/post.rb +0 -0
- data/{test → spec}/rails_app/app/models/user.rb +0 -0
- data/{test → spec}/rails_app/app/views/layouts/application.html.erb +0 -0
- data/{test → spec}/rails_app/app/views/posts/index.html.erb +0 -0
- data/{test → spec}/rails_app/config.ru +0 -0
- data/{test → spec}/rails_app/config/application.rb +0 -0
- data/{test → spec}/rails_app/config/boot.rb +1 -1
- data/{test → spec}/rails_app/config/cucumber.yml +0 -0
- data/{test → spec}/rails_app/config/database.yml +0 -0
- data/{test → spec}/rails_app/config/environment.rb +0 -0
- data/{test → spec}/rails_app/config/environments/development.rb +0 -1
- data/{test → spec}/rails_app/config/environments/production.rb +0 -0
- data/{test → spec}/rails_app/config/environments/test.rb +1 -1
- data/{test → spec}/rails_app/config/initializers/backtrace_silencers.rb +0 -0
- data/spec/rails_app/config/initializers/devise.rb +242 -0
- data/{test → spec}/rails_app/config/initializers/inflections.rb +0 -0
- data/{test → spec}/rails_app/config/initializers/mime_types.rb +0 -0
- data/{test → spec}/rails_app/config/initializers/secret_token.rb +0 -0
- data/{test → spec}/rails_app/config/initializers/session_store.rb +0 -0
- data/{test → spec}/rails_app/config/ldap.yml +0 -0
- data/{test → spec}/rails_app/config/ldap_with_boolean_ssl.yml +0 -0
- data/{test → spec}/rails_app/config/ldap_with_erb.yml +0 -0
- data/{test → spec}/rails_app/config/ldap_with_uid.yml +0 -0
- data/spec/rails_app/config/locales/devise.en.yml +58 -0
- data/{test → spec}/rails_app/config/locales/en.yml +0 -0
- data/{test → spec}/rails_app/config/routes.rb +0 -0
- data/{test → spec}/rails_app/config/ssl_ldap.yml +0 -0
- data/{test → spec}/rails_app/config/ssl_ldap_with_erb.yml +0 -0
- data/{test → spec}/rails_app/config/ssl_ldap_with_uid.yml +0 -0
- data/{test → spec}/rails_app/db/migrate/20100708120448_devise_create_users.rb +18 -4
- data/{test → spec}/rails_app/db/schema.rb +6 -13
- data/{test → spec}/rails_app/features/manage_logins.feature +0 -0
- data/{test → spec}/rails_app/features/step_definitions/login_steps.rb +0 -0
- data/{test → spec}/rails_app/features/step_definitions/web_steps.rb +0 -0
- data/{test → spec}/rails_app/features/support/env.rb +0 -0
- data/{test → spec}/rails_app/features/support/paths.rb +0 -0
- data/{test → spec}/rails_app/lib/tasks/.gitkeep +0 -0
- data/{test → spec}/rails_app/lib/tasks/cucumber.rake +0 -0
- data/{test → spec}/rails_app/public/404.html +0 -0
- data/{test → spec}/rails_app/public/422.html +0 -0
- data/{test → spec}/rails_app/public/500.html +0 -0
- data/{test → spec}/rails_app/public/images/rails.png +0 -0
- data/{test → spec}/rails_app/public/javascripts/application.js +0 -0
- data/{test → spec}/rails_app/public/javascripts/controls.js +0 -0
- data/{test → spec}/rails_app/public/javascripts/dragdrop.js +0 -0
- data/{test → spec}/rails_app/public/javascripts/effects.js +0 -0
- data/{test → spec}/rails_app/public/javascripts/prototype.js +0 -0
- data/{test → spec}/rails_app/public/javascripts/rails.js +0 -0
- data/{test → spec}/rails_app/public/stylesheets/.gitkeep +0 -0
- data/{test → spec}/rails_app/script/cucumber +0 -0
- data/{test → spec}/rails_app/script/rails +0 -0
- data/spec/spec_helper.rb +47 -0
- data/spec/support/factories.rb +16 -0
- data/spec/unit/user_spec.rb +303 -0
- metadata +292 -179
- data/Gemfile.lock +0 -92
- data/rails/init.rb +0 -2
- data/test/devise_ldap_authenticatable_test.rb +0 -8
- data/test/ldap/run-server.sh +0 -10
- data/test/ldap/slapd-ssl-test.conf +0 -107
- data/test/rails_app/Gemfile +0 -22
- data/test/rails_app/Gemfile.lock +0 -159
- data/test/rails_app/app/controllers/application_controller.rb +0 -4
- data/test/rails_app/config/initializers/devise.rb +0 -140
- data/test/rails_app/config/ldap_with_check_membership_off.yml +0 -23
- data/test/rails_app/config/ldap_with_check_membership_on.yml +0 -23
- data/test/rails_app/config/locales/devise.en.yml +0 -39
- data/test/rails_app/db/migrate/20100708120302_create_posts.rb +0 -14
- data/test/rails_app/db/seeds.rb +0 -7
- data/test/rails_app/test/factories/users.rb +0 -14
- data/test/rails_app/test/functional/posts_controller_test.rb +0 -58
- data/test/rails_app/test/performance/browsing_test.rb +0 -9
- data/test/rails_app/test/test_helper.rb +0 -36
- data/test/rails_app/test/unit/helpers/posts_helper_test.rb +0 -4
- data/test/rails_app/test/unit/post_test.rb +0 -4
- data/test/rails_app/test/unit/user_test.rb +0 -314
- data/test/test_helper.rb +0 -3
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 68e24de8c225dff39bf6640f3249b17c28d15a2b
|
|
4
|
+
data.tar.gz: 68335d1a9e0bb5137a1629053f655cc051e019ec
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 16cc901376b48de4f8eeefd811e13272dd10763fe0ae66c42b59ca79cb0543c6a9c985142b43d52db3fc4e9c1e7c461bca9f907904664a6f2b25e34d4d191f46
|
|
7
|
+
data.tar.gz: 9344876e0cf44b2b90fefef75d49346f5f0bffb01d2f4868fdfb9a56fcb68b58d0890ab7025acf8233600e98a4cf8b98476e4f09333fefa50d0b6cc986b9d933
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,39 +1,24 @@
|
|
|
1
1
|
Devise LDAP Authenticatable
|
|
2
2
|
===========================
|
|
3
|
-
|
|
4
3
|
Devise LDAP Authenticatable is a LDAP based authentication strategy for the [Devise](http://github.com/plataformatec/devise) authentication framework.
|
|
5
4
|
|
|
6
5
|
If you are building applications for use within your organization which require authentication and you want to use LDAP, this plugin is for you.
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
**_Please Note_**
|
|
11
|
-
|
|
12
|
-
If you are using rails 2.x then use 0.1.x series of gem, and see the rails2 branch README for instructions.
|
|
13
|
-
|
|
14
|
-
Requirements
|
|
15
|
-
------------
|
|
16
|
-
|
|
17
|
-
- An LDAP server (tested on OpenLDAP)
|
|
18
|
-
- Rails 3.0.0
|
|
19
|
-
|
|
20
|
-
These gems are dependencies of the gem:
|
|
21
|
-
|
|
22
|
-
- Devise ~> 2.0.0
|
|
23
|
-
- net-ldap ~> 0.2.2
|
|
7
|
+
Devise LDAP Authenticatable works in replacement of Database Authenticatable. 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.
|
|
24
8
|
|
|
25
|
-
|
|
26
|
-
------------
|
|
27
|
-
|
|
28
|
-
**_Please Note_**
|
|
9
|
+
For a screencast with an example application, please visit: [http://random-rails.blogspot.com/2010/07/ldap-authentication-with-devise.html](http://random-rails.blogspot.com/2010/07/ldap-authentication-with-devise.html)
|
|
29
10
|
|
|
30
|
-
|
|
11
|
+
Prerequisites
|
|
12
|
+
-------------
|
|
13
|
+
* devise ~> 2.0.0 (which requires rails ~> 3.1)
|
|
14
|
+
* net-ldap ~> 0.2.2
|
|
31
15
|
|
|
16
|
+
Usage
|
|
17
|
+
-----
|
|
32
18
|
In the Gemfile for your application:
|
|
33
19
|
|
|
34
|
-
gem "devise", "~> 2.0"
|
|
35
20
|
gem "devise_ldap_authenticatable"
|
|
36
|
-
|
|
21
|
+
|
|
37
22
|
To get the latest version, pull directly from github instead of the gem:
|
|
38
23
|
|
|
39
24
|
gem "devise_ldap_authenticatable", :git => "git://github.com/cschiewek/devise_ldap_authenticatable.git"
|
|
@@ -41,13 +26,12 @@ To get the latest version, pull directly from github instead of the gem:
|
|
|
41
26
|
|
|
42
27
|
Setup
|
|
43
28
|
-----
|
|
44
|
-
|
|
45
29
|
Run the rails generators for devise (please check the [devise](http://github.com/plataformatec/devise) documents for further instructions)
|
|
46
30
|
|
|
47
31
|
rails generate devise:install
|
|
48
32
|
rails generate devise MODEL_NAME
|
|
49
33
|
|
|
50
|
-
Run the rails generator for devise_ldap_authenticatable
|
|
34
|
+
Run the rails generator for `devise_ldap_authenticatable`
|
|
51
35
|
|
|
52
36
|
rails generate devise_ldap_authenticatable:install [options]
|
|
53
37
|
|
|
@@ -59,120 +43,89 @@ Options:
|
|
|
59
43
|
# Default: user
|
|
60
44
|
[--update-model] # Update model to change from database_authenticatable to ldap_authenticatable
|
|
61
45
|
# Default: true
|
|
62
|
-
[--add-rescue] # Update Application Controller with
|
|
46
|
+
[--add-rescue] # Update Application Controller with rescue_from for DeviseLdapAuthenticatable::LdapException
|
|
63
47
|
# Default: true
|
|
64
48
|
[--advanced] # Add advanced config options to the devise initializer
|
|
65
49
|
|
|
66
|
-
|
|
67
|
-
Usage
|
|
68
|
-
-----
|
|
69
|
-
|
|
70
|
-
Devise LDAP Authenticatable works in replacement of Database Authenticatable
|
|
71
|
-
|
|
72
|
-
**_Please Note_**
|
|
73
|
-
|
|
74
|
-
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.
|
|
75
|
-
|
|
76
|
-
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.
|
|
77
|
-
|
|
78
|
-
|
|
79
50
|
Querying LDAP
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
Given that ldap\_create\_user is set to true and you are authenticating with username, you can query an LDAP server for other attributes.
|
|
51
|
+
-------------
|
|
52
|
+
Given that `ldap_create_user` is set to true and you are authenticating with username, you can query an LDAP server for other attributes.
|
|
83
53
|
|
|
84
54
|
in your user model:
|
|
85
55
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def get_ldap_email
|
|
89
|
-
self.email = Devise::LdapAdapter.get_ldap_param(self.username,"mail")
|
|
90
|
-
end
|
|
56
|
+
before_save :get_ldap_email
|
|
91
57
|
|
|
58
|
+
def get_ldap_email
|
|
59
|
+
self.email = Devise::LdapAdapter.get_ldap_param(self.username,"mail")
|
|
60
|
+
end
|
|
92
61
|
|
|
93
62
|
Configuration
|
|
94
63
|
-------------
|
|
95
|
-
|
|
96
64
|
In initializer `config/initializers/devise.rb` :
|
|
97
65
|
|
|
98
|
-
*
|
|
66
|
+
* `ldap_logger` _(default: true)_
|
|
99
67
|
* If set to true, will log LDAP queries to the Rails logger.
|
|
100
68
|
|
|
101
|
-
*
|
|
102
|
-
|
|
69
|
+
* `ldap_create_user` _(default: false)_
|
|
70
|
+
* If set to true, all valid LDAP users will be allowed to login and an appropriate user record will be created.
|
|
103
71
|
If set to false, you will have to create the user record before they will be allowed to login.
|
|
104
72
|
|
|
105
|
-
*
|
|
73
|
+
* `ldap_config` _(default: #{Rails.root}/config/ldap.yml)_
|
|
106
74
|
* Where to find the LDAP config file. Commented out to use the default, change if needed.
|
|
107
75
|
|
|
108
|
-
*
|
|
76
|
+
* `ldap_update_password` _(default: true)_
|
|
109
77
|
* When doing password resets, if true will update the LDAP server. Requires admin password in the ldap.yml
|
|
110
78
|
|
|
111
|
-
*
|
|
79
|
+
* `ldap_check_group_membership` _(default: false)_
|
|
112
80
|
* When set to true, the user trying to login will be checked to make sure they are in all of groups specified in the ldap.yml file.
|
|
113
81
|
|
|
114
|
-
*
|
|
82
|
+
* `ldap_check_attributes` _(default: false)_
|
|
115
83
|
* When set to true, the user trying to login will be checked to make sure they have all of the attributes in the ldap.yml file.
|
|
116
84
|
|
|
117
|
-
*
|
|
85
|
+
* `ldap_use_admin_to_bind` _(default: false)_
|
|
118
86
|
* When set to true, the admin user will be used to bind to the LDAP server during authentication.
|
|
119
87
|
|
|
120
|
-
|
|
121
88
|
Advanced Configuration
|
|
122
89
|
----------------------
|
|
123
|
-
|
|
124
90
|
These parameters will be added to `config/initializers/devise.rb` when you pass the `--advanced` switch to the generator:
|
|
125
91
|
|
|
126
|
-
*
|
|
92
|
+
* `ldap_auth_username_builder` _(default: `Proc.new() {|attribute, login, ldap| "#{attribute}=#{login},#{ldap.base}" }`)_
|
|
127
93
|
* You can pass a proc to the username option to explicitly specify the format that you search for a users' DN on your LDAP server.
|
|
128
94
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
This has been tested using the following setup:
|
|
95
|
+
Troubleshooting
|
|
96
|
+
--------------
|
|
97
|
+
**Using a "username" instead of an "email":** 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.
|
|
133
98
|
|
|
134
|
-
|
|
135
|
-
* OpenLDAP 2.4.11
|
|
136
|
-
* REE 1.8.7 (2010.02)
|
|
99
|
+
**SSL certificate invalid:** If you're using a test LDAP server running a self-signed SSL certificate, make sure the appropriate root certificate is installed on your system. Alternately, you may temporarily disable certificate checking for SSL by modifying your system LDAP configuration (e.g., `/etc/openldap/ldap.conf` or `/etc/ldap/ldap.conf`) to read `TLS_REQCERT never`.
|
|
137
100
|
|
|
138
|
-
|
|
101
|
+
Development guide
|
|
102
|
+
------------
|
|
103
|
+
To contribute to `devise_ldap_authentication`, you should be able to run a test OpenLDAP server. Specifically, you need the `slapd`, `ldapadd`, and `ldapmodify` binaries.
|
|
139
104
|
|
|
140
|
-
|
|
141
|
-
-----------------------------------------------
|
|
105
|
+
This seems to come out of the box with Mac OS X 10.6.
|
|
142
106
|
|
|
143
|
-
|
|
107
|
+
On Ubuntu (tested on 12.04 and 12.10), you can run `sudo apt-get install slapd ldap-utils`. You will also likely have to add the `spec/ldap` directory of your local git clone to the slapd [apparmor](https://wiki.ubuntu.com/DebuggingApparmor) profile `/etc/apparmor.d/usr.sbin.slapd` if you get permissions errors. Something like this should do:
|
|
144
108
|
|
|
145
|
-
|
|
146
|
-
2. Add the basic structure: `ldapadd -x -h localhost -p 3389 -x -D "cn=admin,dc=test,dc=com" -w secret -f base.ldif`
|
|
147
|
-
* this creates the users / passwords:
|
|
148
|
-
* cn=admin,dc=test,com / secret
|
|
149
|
-
* cn=example.user@test.com,ou=people,dc=test,dc=com / secret
|
|
150
|
-
3. You should now be able to run the tests in test/rails_app by running: `rake`
|
|
151
|
-
|
|
152
|
-
_For a LDAP server running SSL_
|
|
153
|
-
|
|
154
|
-
1. To start the server, run: `./run-server.sh --ssl`
|
|
155
|
-
2. Add the basic structure: `ldapadd -x -H ldaps://localhost:3389 -x -D "cn=admin,dc=test,dc=com" -w secret -f base.ldif`
|
|
156
|
-
* this creates the users / passwords:
|
|
157
|
-
* cn=admin,dc=test,com / secret
|
|
158
|
-
* cn=example.user@test.com,ou=people,dc=test,dc=com / secret
|
|
159
|
-
3. You should now be able to run the tests in test/rails_app by running: `LDAP_SSL=true rake`
|
|
109
|
+
/path/to/devise_ldap_authenticatable/spec/ldap/** rw,$
|
|
160
110
|
|
|
161
|
-
|
|
111
|
+
To start hacking on `devise_ldap_authentication`, clone the github repository, start the test LDAP server, and run the rake test task:
|
|
162
112
|
|
|
163
|
-
|
|
113
|
+
git clone https://github.com/cschiewek/devise_ldap_authenticatable.git
|
|
114
|
+
cd devise_ldap_authenticatable
|
|
115
|
+
bundle install
|
|
164
116
|
|
|
165
|
-
|
|
117
|
+
# in a separate console or backgrounded
|
|
118
|
+
./spec/ldap/run-server
|
|
166
119
|
|
|
167
|
-
|
|
120
|
+
bundle exec rake db:migrate # first time only
|
|
121
|
+
bundle exec rake spec
|
|
168
122
|
|
|
169
123
|
References
|
|
170
124
|
----------
|
|
171
|
-
|
|
172
125
|
* [OpenLDAP](http://www.openldap.org/)
|
|
173
126
|
* [Devise](http://github.com/plataformatec/devise)
|
|
174
127
|
* [Warden](http://github.com/hassox/warden)
|
|
175
128
|
|
|
176
129
|
Released under the MIT license
|
|
177
130
|
|
|
178
|
-
Copyright (c)
|
|
131
|
+
Copyright (c) 2012 [Curtis Schiewek](https://github.com/cschiewek), [Daniel McNevin](https://github.com/dpmcnevin), [Steven Xu](https://github.com/cairo140)
|
data/Rakefile
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require '
|
|
3
|
-
require 'rake/rdoctask'
|
|
1
|
+
require File.expand_path('spec/rails_app/config/environment', File.dirname(__FILE__))
|
|
2
|
+
require 'rdoc/task'
|
|
4
3
|
|
|
5
|
-
desc 'Default: run
|
|
6
|
-
task :default => :
|
|
4
|
+
desc 'Default: run test suite.'
|
|
5
|
+
task :default => :spec
|
|
7
6
|
|
|
8
7
|
desc 'Generate documentation for the devise_ldap_authenticatable plugin.'
|
|
9
8
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
10
9
|
rdoc.rdoc_dir = 'rdoc'
|
|
11
10
|
rdoc.title = 'DeviseLDAPAuthenticatable'
|
|
12
11
|
rdoc.options << '--line-numbers' << '--inline-source'
|
|
13
|
-
rdoc.rdoc_files.include('README')
|
|
12
|
+
rdoc.rdoc_files.include('README.md')
|
|
14
13
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
15
|
-
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
RailsApp::Application.load_tasks
|
|
@@ -17,6 +17,18 @@ Gem::Specification.new do |s|
|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
18
|
s.require_paths = ["lib"]
|
|
19
19
|
|
|
20
|
-
s.add_dependency('devise', '
|
|
21
|
-
s.add_dependency('net-ldap', '~> 0.
|
|
22
|
-
|
|
20
|
+
s.add_dependency('devise', '~> 2.0')
|
|
21
|
+
s.add_dependency('net-ldap', '~> 0.3.1')
|
|
22
|
+
|
|
23
|
+
s.add_development_dependency('rake', '>= 0.9')
|
|
24
|
+
s.add_development_dependency('rdoc', '>= 3')
|
|
25
|
+
s.add_development_dependency('rails', '>= 3.2')
|
|
26
|
+
s.add_development_dependency('sqlite3')
|
|
27
|
+
s.add_development_dependency('factory_girl_rails', '~> 1.0')
|
|
28
|
+
s.add_development_dependency('factory_girl', '~> 2.0')
|
|
29
|
+
s.add_development_dependency('rspec-rails')
|
|
30
|
+
|
|
31
|
+
%w{database_cleaner capybara launchy}.each do |dep|
|
|
32
|
+
s.add_development_dependency(dep)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "net/ldap"
|
|
2
2
|
|
|
3
3
|
module Devise
|
|
4
|
-
|
|
5
4
|
module LdapAdapter
|
|
5
|
+
DEFAULT_GROUP_UNIQUE_MEMBER_LIST_KEY = 'uniqueMember'
|
|
6
6
|
|
|
7
7
|
def self.valid_credentials?(login, password_plaintext)
|
|
8
8
|
options = {:login => login,
|
|
@@ -25,7 +25,7 @@ module Devise
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def self.update_own_password(login, new_password, current_password)
|
|
28
|
-
set_ldap_param(login, :userpassword, new_password, current_password)
|
|
28
|
+
set_ldap_param(login, :userpassword, Net::LDAP::Password.generate(:sha, new_password), current_password)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def self.ldap_connect(login)
|
|
@@ -44,6 +44,10 @@ module Devise
|
|
|
44
44
|
self.ldap_connect(login).user_groups
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
+
def self.in_ldap_group?(login, group_name, group_attribute = nil)
|
|
48
|
+
self.ldap_connect(login).in_group?(group_name, group_attribute)
|
|
49
|
+
end
|
|
50
|
+
|
|
47
51
|
def self.get_dn(login)
|
|
48
52
|
self.ldap_connect(login).dn
|
|
49
53
|
end
|
|
@@ -154,7 +158,18 @@ module Devise
|
|
|
154
158
|
|
|
155
159
|
def authorized?
|
|
156
160
|
DeviseLdapAuthenticatable::Logger.send("Authorizing user #{dn}")
|
|
157
|
-
authenticated?
|
|
161
|
+
if !authenticated?
|
|
162
|
+
DeviseLdapAuthenticatable::Logger.send("Not authorized because not authenticated.")
|
|
163
|
+
return false
|
|
164
|
+
elsif !in_required_groups?
|
|
165
|
+
DeviseLdapAuthenticatable::Logger.send("Not authorized because not in required groups.")
|
|
166
|
+
return false
|
|
167
|
+
elsif !has_required_attribute?
|
|
168
|
+
DeviseLdapAuthenticatable::Logger.send("Not authorized because does not have required attribute.")
|
|
169
|
+
return false
|
|
170
|
+
else
|
|
171
|
+
return true
|
|
172
|
+
end
|
|
158
173
|
end
|
|
159
174
|
|
|
160
175
|
def change_password!
|
|
@@ -167,37 +182,44 @@ module Devise
|
|
|
167
182
|
## FIXME set errors here, the ldap.yml isn't set properly.
|
|
168
183
|
return false if @required_groups.nil?
|
|
169
184
|
|
|
170
|
-
admin_ldap = LdapConnect.admin
|
|
171
|
-
|
|
172
185
|
for group in @required_groups
|
|
173
186
|
if group.is_a?(Array)
|
|
174
|
-
|
|
187
|
+
return false unless in_group?(group[1], group[0])
|
|
175
188
|
else
|
|
176
|
-
|
|
177
|
-
group_name = group
|
|
189
|
+
return false unless in_group?(group)
|
|
178
190
|
end
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
# Will return the user entry if belongs to group otherwise nothing
|
|
193
|
-
unless search_result.length == 1 && search_result[0].dn.eql?(dn)
|
|
194
|
-
DeviseLdapAuthenticatable::Logger.send("User #{dn} is not in group: #{group_name }")
|
|
195
|
-
return false
|
|
191
|
+
end
|
|
192
|
+
return true
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def in_group?(group_name, group_attribute = DEFAULT_GROUP_UNIQUE_MEMBER_LIST_KEY)
|
|
196
|
+
in_group = false
|
|
197
|
+
|
|
198
|
+
admin_ldap = LdapConnect.admin
|
|
199
|
+
|
|
200
|
+
unless ::Devise.ldap_ad_group_check
|
|
201
|
+
admin_ldap.search(:base => group_name, :scope => Net::LDAP::SearchScope_BaseObject) do |entry|
|
|
202
|
+
if entry[group_attribute].include? dn
|
|
203
|
+
in_group = true
|
|
196
204
|
end
|
|
197
205
|
end
|
|
206
|
+
else
|
|
207
|
+
# AD optimization - extension will recursively check sub-groups with one query
|
|
208
|
+
# "(memberof:1.2.840.113556.1.4.1941:=group_name)"
|
|
209
|
+
search_result = admin_ldap.search(:base => dn,
|
|
210
|
+
:filter => Net::LDAP::Filter.ex("memberof:1.2.840.113556.1.4.1941", group_name),
|
|
211
|
+
:scope => Net::LDAP::SearchScope_BaseObject)
|
|
212
|
+
# Will return the user entry if belongs to group otherwise nothing
|
|
213
|
+
if search_result.length == 1 && search_result[0].dn.eql?(dn)
|
|
214
|
+
in_group = true
|
|
215
|
+
end
|
|
198
216
|
end
|
|
199
217
|
|
|
200
|
-
|
|
218
|
+
unless in_group
|
|
219
|
+
DeviseLdapAuthenticatable::Logger.send("User #{dn} is not in group: #{group_name}")
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
return in_group
|
|
201
223
|
end
|
|
202
224
|
|
|
203
225
|
def has_required_attribute?
|
|
@@ -236,7 +258,9 @@ module Devise
|
|
|
236
258
|
DeviseLdapAuthenticatable::Logger.send("LDAP search for login: #{@attribute}=#{@login}")
|
|
237
259
|
filter = Net::LDAP::Filter.eq(@attribute.to_s, @login.to_s)
|
|
238
260
|
ldap_entry = nil
|
|
239
|
-
|
|
261
|
+
match_count = 0
|
|
262
|
+
@ldap.search(:filter => filter) {|entry| ldap_entry = entry; match_count+=1}
|
|
263
|
+
DeviseLdapAuthenticatable::Logger.send("LDAP search yielded #{match_count} matches")
|
|
240
264
|
ldap_entry
|
|
241
265
|
end
|
|
242
266
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'devise_ldap_authenticatable/strategy'
|
|
1
|
+
require 'devise_ldap_authenticatable/strategy'
|
|
2
2
|
|
|
3
3
|
module Devise
|
|
4
4
|
module Models
|
|
@@ -53,6 +53,10 @@ module Devise
|
|
|
53
53
|
Devise::LdapAdapter.get_groups(login_with)
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
+
def in_ldap_group?(group_name, group_attribute = LdapAdapter::DEFAULT_GROUP_UNIQUE_MEMBER_LIST_KEY)
|
|
57
|
+
Devise::LdapAdapter.in_ldap_group?(login_with, group_name, group_attribute)
|
|
58
|
+
end
|
|
59
|
+
|
|
56
60
|
def ldap_dn
|
|
57
61
|
Devise::LdapAdapter.get_dn(login_with)
|
|
58
62
|
end
|