aker 3.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +210 -0
- data/README.md +282 -0
- data/assets/aker/form/login.css +73 -0
- data/assets/aker/form/login.html.erb +44 -0
- data/lib/aker/authorities/automatic_access.rb +36 -0
- data/lib/aker/authorities/composite.rb +301 -0
- data/lib/aker/authorities/static.rb +283 -0
- data/lib/aker/authorities/support/find_sole_user.rb +24 -0
- data/lib/aker/authorities/support.rb +9 -0
- data/lib/aker/authorities.rb +46 -0
- data/lib/aker/cas/authority.rb +79 -0
- data/lib/aker/cas/configuration_helper.rb +85 -0
- data/lib/aker/cas/middleware/logout_responder.rb +49 -0
- data/lib/aker/cas/middleware/ticket_remover.rb +35 -0
- data/lib/aker/cas/middleware.rb +6 -0
- data/lib/aker/cas/proxy_mode.rb +108 -0
- data/lib/aker/cas/rack_proxy_callback.rb +188 -0
- data/lib/aker/cas/service_mode.rb +88 -0
- data/lib/aker/cas/service_url.rb +62 -0
- data/lib/aker/cas/user_ext.rb +64 -0
- data/lib/aker/cas.rb +31 -0
- data/lib/aker/central_parameters.rb +101 -0
- data/lib/aker/configuration.rb +534 -0
- data/lib/aker/deprecation.rb +105 -0
- data/lib/aker/form/custom_views_mode.rb +80 -0
- data/lib/aker/form/login_form_asset_provider.rb +56 -0
- data/lib/aker/form/middleware/custom_view_login_responder.rb +19 -0
- data/lib/aker/form/middleware/login_renderer.rb +72 -0
- data/lib/aker/form/middleware/login_responder.rb +71 -0
- data/lib/aker/form/middleware/logout_responder.rb +26 -0
- data/lib/aker/form/middleware.rb +10 -0
- data/lib/aker/form/mode.rb +118 -0
- data/lib/aker/form.rb +26 -0
- data/lib/aker/group.rb +67 -0
- data/lib/aker/group_membership.rb +162 -0
- data/lib/aker/ldap/authority.rb +392 -0
- data/lib/aker/ldap/user_ext.rb +19 -0
- data/lib/aker/ldap.rb +22 -0
- data/lib/aker/modes/base.rb +85 -0
- data/lib/aker/modes/http_basic.rb +100 -0
- data/lib/aker/modes/support/attempted_path.rb +22 -0
- data/lib/aker/modes/support/rfc_2617.rb +32 -0
- data/lib/aker/modes/support.rb +12 -0
- data/lib/aker/modes.rb +48 -0
- data/lib/aker/rack/authenticate.rb +37 -0
- data/lib/aker/rack/configuration_helper.rb +18 -0
- data/lib/aker/rack/default_logout_responder.rb +36 -0
- data/lib/aker/rack/environment_helper.rb +34 -0
- data/lib/aker/rack/facade.rb +102 -0
- data/lib/aker/rack/failure.rb +69 -0
- data/lib/aker/rack/logout.rb +63 -0
- data/lib/aker/rack/request_ext.rb +19 -0
- data/lib/aker/rack/session_timer.rb +95 -0
- data/lib/aker/rack/setup.rb +77 -0
- data/lib/aker/rack.rb +107 -0
- data/lib/aker/test/helpers.rb +22 -0
- data/lib/aker/test.rb +8 -0
- data/lib/aker/user.rb +231 -0
- data/lib/aker/version.rb +3 -0
- data/lib/aker.rb +51 -0
- data/spec/aker/aker-sample.yml +11 -0
- data/spec/aker/authorities/automatic_access_spec.rb +52 -0
- data/spec/aker/authorities/composite_spec.rb +488 -0
- data/spec/aker/authorities/nu-schema.jar +0 -0
- data/spec/aker/authorities/static_spec.rb +455 -0
- data/spec/aker/authorities/support/find_sole_user_spec.rb +33 -0
- data/spec/aker/authorities_spec.rb +16 -0
- data/spec/aker/cas/authority_spec.rb +106 -0
- data/spec/aker/cas/configuration_helper_spec.rb +92 -0
- data/spec/aker/cas/middleware/logout_responder_spec.rb +47 -0
- data/spec/aker/cas/middleware/ticket_remover_spec.rb +49 -0
- data/spec/aker/cas/proxy_mode_spec.rb +185 -0
- data/spec/aker/cas/rack_proxy_callback_spec.rb +190 -0
- data/spec/aker/cas/service_mode_spec.rb +122 -0
- data/spec/aker/cas/service_url_spec.rb +114 -0
- data/spec/aker/cas/user_ext_spec.rb +27 -0
- data/spec/aker/cas_spec.rb +19 -0
- data/spec/aker/central_parameters_spec.rb +44 -0
- data/spec/aker/configuration_spec.rb +465 -0
- data/spec/aker/deprecation_spec.rb +115 -0
- data/spec/aker/form/a_form_mode.rb +129 -0
- data/spec/aker/form/custom_views_mode_spec.rb +34 -0
- data/spec/aker/form/login_form_asset_provider_spec.rb +80 -0
- data/spec/aker/form/middleware/a_form_login_responder.rb +89 -0
- data/spec/aker/form/middleware/custom_view_login_responder_spec.rb +47 -0
- data/spec/aker/form/middleware/login_renderer_spec.rb +56 -0
- data/spec/aker/form/middleware/login_responder_spec.rb +34 -0
- data/spec/aker/form/middleware/logout_responder_spec.rb +55 -0
- data/spec/aker/form/mode_spec.rb +15 -0
- data/spec/aker/form_spec.rb +11 -0
- data/spec/aker/group_membership_spec.rb +208 -0
- data/spec/aker/group_spec.rb +66 -0
- data/spec/aker/ldap/authority_spec.rb +414 -0
- data/spec/aker/ldap/ldap-users.ldif +197 -0
- data/spec/aker/ldap_spec.rb +11 -0
- data/spec/aker/modes/a_aker_mode.rb +41 -0
- data/spec/aker/modes/http_basic_spec.rb +127 -0
- data/spec/aker/modes/support/attempted_path_spec.rb +32 -0
- data/spec/aker/modes_spec.rb +11 -0
- data/spec/aker/rack/authenticate_spec.rb +78 -0
- data/spec/aker/rack/default_logout_responder_spec.rb +67 -0
- data/spec/aker/rack/facade_spec.rb +154 -0
- data/spec/aker/rack/failure_spec.rb +151 -0
- data/spec/aker/rack/logout_spec.rb +63 -0
- data/spec/aker/rack/request_ext_spec.rb +29 -0
- data/spec/aker/rack/session_timer_spec.rb +134 -0
- data/spec/aker/rack/setup_spec.rb +87 -0
- data/spec/aker/rack_spec.rb +216 -0
- data/spec/aker/test/helpers_spec.rb +44 -0
- data/spec/aker/user_spec.rb +362 -0
- data/spec/aker_spec.rb +80 -0
- data/spec/deprecation_helper.rb +58 -0
- data/spec/java_helper.rb +5 -0
- data/spec/logger_helper.rb +17 -0
- data/spec/matchers.rb +31 -0
- data/spec/mock_builder.rb +25 -0
- data/spec/spec_helper.rb +52 -0
- metadata +265 -0
data/CHANGELOG.md
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
Aker History
|
2
|
+
============
|
3
|
+
|
4
|
+
3.0.0
|
5
|
+
-----
|
6
|
+
- First open-source version.
|
7
|
+
- Project renamed from "Bcsec" (short for Bioinformatics Core
|
8
|
+
security) to "Aker" (ancient Egyptian god of the horizon).
|
9
|
+
- Bcsec contained several authorities which were specific to NUBIC;
|
10
|
+
those have been removed and purged from the git history for the
|
11
|
+
project.
|
12
|
+
- Added :custom_form mode (#1).
|
13
|
+
|
14
|
+
Bcsec History
|
15
|
+
=============
|
16
|
+
|
17
|
+
This is the history for the parts of Bcsec which remain in
|
18
|
+
Aker. Versions that only included changes to code which has been
|
19
|
+
removed from the open source version have been removed.
|
20
|
+
|
21
|
+
2.2.0
|
22
|
+
-----
|
23
|
+
- Introduced the concept of "configuration slices" so that extensions
|
24
|
+
may add default configuration values. (#5875)
|
25
|
+
- Introduced mode registration and authority aliases so that named
|
26
|
+
modes and authorities can have arbitrary class names. (#5875)
|
27
|
+
- Introduced the ability to configure rack middleware to be installed
|
28
|
+
relative to bcsec (outside of modes). (#5875)
|
29
|
+
- Bcsec now has a 30 minute session timeout. (#5156)
|
30
|
+
- It is now possible to customize the login and logout pages when using the
|
31
|
+
`form` mode. (#5469)
|
32
|
+
- Added a generic LDAP authority. (#5876)
|
33
|
+
- Send a permanent redirect after a successful CAS authentication in
|
34
|
+
order to prevent the service ticket from showing up in the user's
|
35
|
+
browsing history. (#2725)
|
36
|
+
- Extract and expose the method for determining the CAS service URL
|
37
|
+
for a particular request. (See `Bcsec::Cas::ServiceUrl`.)
|
38
|
+
- Updated JRuby tested version to 1.6.2.
|
39
|
+
|
40
|
+
2.1.0
|
41
|
+
-----
|
42
|
+
|
43
|
+
- ActiveRecord / ActiveSupport 3 compatibility. (#2804)
|
44
|
+
- Fixed: user information is no longer saved in the session in
|
45
|
+
non-interactive modes. (#2757)
|
46
|
+
|
47
|
+
2.0.5
|
48
|
+
-----
|
49
|
+
|
50
|
+
- Updated tested platforms to JRuby 1.5.3 and Ruby 1.9.2. (MRI 1.8.7
|
51
|
+
in the specific form of REE 2010.02 remains the same.)
|
52
|
+
|
53
|
+
2.0.4
|
54
|
+
-----
|
55
|
+
|
56
|
+
- Changed: the #find_users method on the authorities interface now
|
57
|
+
accepts one or more separate criteria. The separate criteria are
|
58
|
+
joined using a logical OR. All the built-in authorities have been
|
59
|
+
updated to support this; custom authorities may need to be updated
|
60
|
+
as well. (#4027)
|
61
|
+
- Added: `Bcsec::Authorities::Static#load!` will now load arbitrary
|
62
|
+
`Bcsec::User` attributes from the YAML file, not just the username,
|
63
|
+
password, and authorization information. (#4297)
|
64
|
+
- Changed: Depend on net-ldap 0.1.1 instead of ruby-net-ldap 0.0.4.
|
65
|
+
This new version of the net/ldap library is backwards compatible,
|
66
|
+
interface-wise, but it trades 1.8.6- support for 1.9+ support.
|
67
|
+
|
68
|
+
2.0.3
|
69
|
+
-----
|
70
|
+
|
71
|
+
- Fixed: static authority now allows different users to have the same
|
72
|
+
password. (#4068)
|
73
|
+
|
74
|
+
2.0.1
|
75
|
+
-----
|
76
|
+
|
77
|
+
- Added `Bcsec::Authorities::AutomaticAccess`.
|
78
|
+
|
79
|
+
2.0.0
|
80
|
+
-----
|
81
|
+
|
82
|
+
- Complete rewrite: better architecture (no sole singletons); rack
|
83
|
+
support; better RESTful API authentication support; support for MRI
|
84
|
+
1.8.7, JRuby, and YARV 1.9.1; and much more.
|
85
|
+
|
86
|
+
1.6.1
|
87
|
+
-----
|
88
|
+
|
89
|
+
- Correct MockAuthenticator-authorized users so that they reflect the
|
90
|
+
appropriate group memberships when logging in with CAS (bug #2221)
|
91
|
+
- Prevent nil dereference in User#in_group? when the user has no groups at all
|
92
|
+
|
93
|
+
1.6.0
|
94
|
+
-----
|
95
|
+
|
96
|
+
- Fix nil-sensitivity bug in Bcsec.use_cas (#1994)
|
97
|
+
- Remove explicit `gem` invocations from library code
|
98
|
+
- Make minor changes to allow bcsec to run under jruby 1.4.0
|
99
|
+
|
100
|
+
1.5.2
|
101
|
+
-----
|
102
|
+
|
103
|
+
- Modify build layout a bit so that the source directory can be used with
|
104
|
+
bundler's :path option in sowsear
|
105
|
+
|
106
|
+
1.5.0
|
107
|
+
-----
|
108
|
+
|
109
|
+
- Update to use open source versions of bcdatabase and
|
110
|
+
schema_qualified_tables.
|
111
|
+
|
112
|
+
1.4.8
|
113
|
+
-----
|
114
|
+
|
115
|
+
- Configuration from use_cas now propagates to RailsCasFilter.
|
116
|
+
|
117
|
+
1.4.0
|
118
|
+
-----
|
119
|
+
|
120
|
+
- Allow CAS configuration parameters to be passed to use_cas.
|
121
|
+
These parameters are passed directly to CASClient::Client; see
|
122
|
+
http://rubycas-client.rubyforge.org/ for configuration details.
|
123
|
+
These parameters override central configuration.
|
124
|
+
|
125
|
+
1.3.0
|
126
|
+
-----
|
127
|
+
|
128
|
+
- Dev: support deploy:tag from git-svn clones
|
129
|
+
|
130
|
+
1.2.6
|
131
|
+
-----
|
132
|
+
|
133
|
+
- Added Bcsec::AuthenticateOnlyAuthenticator for when you only need to
|
134
|
+
authenticate. It responds to allow_access? and always returns true.
|
135
|
+
- Added ability to add authenticators with may_access? method only.
|
136
|
+
- Added rspec-rails version to use when running specs.
|
137
|
+
|
138
|
+
1.2.2
|
139
|
+
-----
|
140
|
+
|
141
|
+
- Correct _dependency_ definitions in gemspec. (Was using _requirements_,
|
142
|
+
which are informational only.) `gem install bcsec` will now install all
|
143
|
+
dependent gems.
|
144
|
+
|
145
|
+
1.2.1
|
146
|
+
-----
|
147
|
+
|
148
|
+
- Clear the effects of use_cas in Bcsec::Configurator#clear
|
149
|
+
|
150
|
+
1.2.0
|
151
|
+
-----
|
152
|
+
|
153
|
+
- Add Bcsec::portal_set? and similar to allow querying whether certain
|
154
|
+
config attributes are set without throwing an exception when they aren't.
|
155
|
+
- Add adapter code in rspec_helper.rb so that rspec-rails can be used as a gem.
|
156
|
+
|
157
|
+
1.1.0
|
158
|
+
-----
|
159
|
+
|
160
|
+
- Added publicly-accessible method Bcsec#amplify! to provide bcsec consumers
|
161
|
+
with the ability to manually invoke group data retrieval.
|
162
|
+
|
163
|
+
1.0.1
|
164
|
+
-----
|
165
|
+
|
166
|
+
- Fix issue when having multiple authenticors and the first one returns no groups
|
167
|
+
|
168
|
+
1.0.0
|
169
|
+
-----
|
170
|
+
|
171
|
+
- A user's security groups are cached in the current user object in the
|
172
|
+
session.
|
173
|
+
- In group checks are handled in memory instead of hitting the database every
|
174
|
+
time.
|
175
|
+
- Added dependency on RubyTree gem
|
176
|
+
|
177
|
+
0.1.1
|
178
|
+
-----
|
179
|
+
|
180
|
+
- Fix issue where Bcsec::CentralAuthenticationParameters would sometimes not be
|
181
|
+
automatically resolved by applications using ActiveSupport's dependency
|
182
|
+
loader.
|
183
|
+
|
184
|
+
0.1.0
|
185
|
+
-----
|
186
|
+
|
187
|
+
- Add CAS support
|
188
|
+
- Add MockAuthenticator#load_credentials! to support loading test credentials
|
189
|
+
from a file.
|
190
|
+
|
191
|
+
0.0.2
|
192
|
+
-----
|
193
|
+
|
194
|
+
- Adapt deploy task to be multi-developer friendly
|
195
|
+
- Add separate uninstall task to return to published version
|
196
|
+
|
197
|
+
0.0.1
|
198
|
+
-----
|
199
|
+
|
200
|
+
- Fix rake tasks for deploy, local install
|
201
|
+
- Integrate ci_reporter
|
202
|
+
- Add rudimentary environment support in order to build in hudson
|
203
|
+
- Made site affiliate portal foreign key explicit
|
204
|
+
|
205
|
+
0.0.0
|
206
|
+
-----
|
207
|
+
|
208
|
+
- Extract non-rails-specific bcsec elements from bcsec engine.
|
209
|
+
- Convert test/unit tests moved from bcsec plugin into rspec specs. (Shallow
|
210
|
+
conversion only so far.)
|
data/README.md
ADDED
@@ -0,0 +1,282 @@
|
|
1
|
+
Aker
|
2
|
+
====
|
3
|
+
|
4
|
+
Aker is a library for managing authentication and authorization in
|
5
|
+
ruby applications (particularly Rack applications). It is designed to
|
6
|
+
extensibly work with your existing (possibly legacy) authentication
|
7
|
+
infrastructure.
|
8
|
+
|
9
|
+
Aker is made up of **authorities** which provide user security
|
10
|
+
information, **modes** which integrate authentication with HTTP (via
|
11
|
+
Rack), and a **configuration** which specifies which of these to use
|
12
|
+
and how to set them up.
|
13
|
+
|
14
|
+
Reader's note: this README uses [YARD][] markup to provide links to
|
15
|
+
Aker's API documentation. If you aren't already, consider reading it
|
16
|
+
on [rubydoc.info][] so that the links will be followable.
|
17
|
+
|
18
|
+
[YARD]: http://yardoc.org/
|
19
|
+
[rubydoc.info]: http://rubydoc.info/github/NUBIC/aker/master/file/README.md
|
20
|
+
|
21
|
+
Aker concepts
|
22
|
+
-------------
|
23
|
+
|
24
|
+
### Authorities
|
25
|
+
|
26
|
+
An **authority** in Aker is the encapsulation of a mechanism for
|
27
|
+
providing authentication and/or authorization. The methods which an
|
28
|
+
authority may implement (all are optional) are described in detail in
|
29
|
+
the documentation for the {Aker::Authorities::Composite composite
|
30
|
+
authority}. All the included authorities are described in the
|
31
|
+
documentation for the {Aker::Authorities} module. See their
|
32
|
+
documentation for more information.
|
33
|
+
|
34
|
+
More than one authority can be used in a particular configuration.
|
35
|
+
When validating credentials or performing any of the other actions
|
36
|
+
provided by the authority interface, all the authorities will be
|
37
|
+
consulted. The documentation for the composite authority describes
|
38
|
+
how the results are aggregated for each action.
|
39
|
+
|
40
|
+
### Modes
|
41
|
+
|
42
|
+
An Aker **mode** is a mechanism for receiving credentials in the context
|
43
|
+
of a web application. Aker modes come in variants that are intended
|
44
|
+
for use in human-user-facing contexts (*UI* modes) and machine-facing
|
45
|
+
contexts (*API* modes). It is possible for the same mode to act in
|
46
|
+
both capacities.
|
47
|
+
|
48
|
+
An application may have zero-to-many API modes, but only one UI mode.
|
49
|
+
API modes work within a standard [RFC2617][] HTTP Authorization
|
50
|
+
interface, while UI modes have broad access to the Rack environment to
|
51
|
+
prompt the user as necessary.
|
52
|
+
|
53
|
+
All the included modes are described in the documentation of the
|
54
|
+
{Aker::Modes} module. See their documentation for more information.
|
55
|
+
If you would like to implement your own mode, see {Aker::Modes::Base}.
|
56
|
+
|
57
|
+
#### API vs. UI
|
58
|
+
|
59
|
+
Aker uses the following heuristic to determine whether to attempt to
|
60
|
+
authenticate a particular request using the configured UI mode or API
|
61
|
+
mode(s):
|
62
|
+
|
63
|
+
* If there are no API modes configured, requests are always handled by
|
64
|
+
the UI mode.
|
65
|
+
* If the HTTP Accept header includes `text/html` (literally includes
|
66
|
+
it, not matches it), the request is handled by the UI mode.
|
67
|
+
* If the HTTP User-Agent header includes `Mozilla`, the request is
|
68
|
+
handled by the UI mode.
|
69
|
+
* Otherwise, the request is handled by the API mode(s).
|
70
|
+
|
71
|
+
[RFC2617]: http://www.ietf.org/rfc/rfc2617.txt
|
72
|
+
|
73
|
+
### Configuration
|
74
|
+
|
75
|
+
The aker **configuration** is where you define the authorities and
|
76
|
+
modes (and their parameters) for your application. It's a class whose
|
77
|
+
instances can be initialized both {Aker::Configuration traditionally}
|
78
|
+
and using a {Aker::ConfiguratorLanguage DSL}. There's a global
|
79
|
+
instance ({Aker.configuration}) which will be sufficient for most
|
80
|
+
uses and which can be updated using the DSL via {Aker.configure}.
|
81
|
+
|
82
|
+
Since {Aker.configure} updates the configuration (rather than
|
83
|
+
replacing it), it is worthwhile to consider splitting up your
|
84
|
+
configuration into environment-specific and common parts. For
|
85
|
+
instance, you might have the common configuration:
|
86
|
+
|
87
|
+
Aker.configure {
|
88
|
+
ui_mode :form
|
89
|
+
api_mode :http_basic
|
90
|
+
}
|
91
|
+
|
92
|
+
And then for your development environment use:
|
93
|
+
|
94
|
+
Aker.configure {
|
95
|
+
authority Aker::Authorities::Static.from_file("#{Rails.root}/environments/development-users.yml")
|
96
|
+
central "/etc/nubic/aker-local.yml"
|
97
|
+
}
|
98
|
+
|
99
|
+
And in your tests use:
|
100
|
+
|
101
|
+
Aker.configure {
|
102
|
+
authority Aker::Authorities::Static.from_file("#{Rails.root}/spec/test-users.yml")
|
103
|
+
}
|
104
|
+
|
105
|
+
But then in production use:
|
106
|
+
|
107
|
+
Aker.configure {
|
108
|
+
authorities :ldap
|
109
|
+
central "/etc/nubic/aker-prod.yml"
|
110
|
+
}
|
111
|
+
|
112
|
+
Using form authentication
|
113
|
+
-------------------------
|
114
|
+
|
115
|
+
Aker's {Aker::Form::Mode :form} mode provides a traditional HTML
|
116
|
+
form for user authentication. It works with one or more authorities
|
117
|
+
which handle the `:user` credential kind — compatible
|
118
|
+
authorities that ship with Aker are {Aker::Ldap::Authority
|
119
|
+
:ldap}, and {Aker::Authorities::Static :static}.
|
120
|
+
|
121
|
+
`:form` is the default UI mode. If you want to explicitly configure
|
122
|
+
it, do like so:
|
123
|
+
|
124
|
+
Aker.configure {
|
125
|
+
authorities :static # whatever is appropriate for your app
|
126
|
+
ui_mode :form
|
127
|
+
}
|
128
|
+
|
129
|
+
Using CAS
|
130
|
+
---------
|
131
|
+
|
132
|
+
Aker's {Aker::Cas::ServiceMode :cas} mode provides interactive user
|
133
|
+
authentication via an external CAS 2 server. The
|
134
|
+
{Aker::Cas::ProxyMode :cas_proxy} mode complements `:cas` by providing
|
135
|
+
non-interactive authentication using CAS proxy tickets. Each of these
|
136
|
+
modes works with an authority which can handle the corresponding
|
137
|
+
credential kind (i.e., `:cas` needs a `:cas`-handling authority). The
|
138
|
+
{Aker::Cas::Authority :cas} authority handles both. Here's an
|
139
|
+
example configuration:
|
140
|
+
|
141
|
+
Aker.configure {
|
142
|
+
authority :cas
|
143
|
+
ui_mode :cas
|
144
|
+
api_mode :cas_proxy # don't include unless needed
|
145
|
+
}
|
146
|
+
|
147
|
+
(The `:static` authority can also verify `:cas` and `:cas_proxy`
|
148
|
+
credentials, but it is relatively awkward to set up and so is left as
|
149
|
+
an exercise for the adventurous integrated tester.)
|
150
|
+
|
151
|
+
Since the CAS server provides authentication only, you may also want
|
152
|
+
to configure an authority to provide authorization information.
|
153
|
+
|
154
|
+
Authenticating a RESTful API
|
155
|
+
----------------------------
|
156
|
+
|
157
|
+
As noted above, Aker has specific support for [RFC2617][]-style
|
158
|
+
standard HTTP authentication. It supports multiple simultaneous API
|
159
|
+
authentication modes. The most common case for multiple API modes
|
160
|
+
will be CAS-protected APIs which also need to provide non-interactive
|
161
|
+
API access (e.g., for cron jobs, since they are not run in the context
|
162
|
+
of a user logged into any particular application). Here's a sample
|
163
|
+
configuration:
|
164
|
+
|
165
|
+
Aker.configure {
|
166
|
+
ui_mode :cas
|
167
|
+
api_mode :http_basic, :cas_proxy
|
168
|
+
|
169
|
+
authorities :cas, :ldap
|
170
|
+
|
171
|
+
central "/etc/nubic/aker-local.yml"
|
172
|
+
}
|
173
|
+
|
174
|
+
In this case, the CAS server will be used for interactive logins and
|
175
|
+
for CAS proxy ticket validation, while HTTP Basic-authenticated
|
176
|
+
requests will be validated using the `:ldap` authority.
|
177
|
+
|
178
|
+
Rack (and Rails) integration
|
179
|
+
----------------------------
|
180
|
+
|
181
|
+
Aker's web application integration is based on [Rack][]. This means
|
182
|
+
it can be used with nearly any ruby web framework, including Sinatra,
|
183
|
+
Camping, etc., in addition to Rails.
|
184
|
+
|
185
|
+
In your Aker-protected Rack application, you have access to a
|
186
|
+
`"aker.check"` key in the Rack environment. This key will yield an
|
187
|
+
instance of {Aker::Rack::Facade} which provides methods for
|
188
|
+
determining who is logged in, checking permissions, requiring
|
189
|
+
authentication, etc. See its API documentation for more information.
|
190
|
+
|
191
|
+
To configure Aker into your Rack application, use
|
192
|
+
{Aker::Rack.use_in}. See that method's API documentation for more
|
193
|
+
information.
|
194
|
+
|
195
|
+
#### Rails
|
196
|
+
|
197
|
+
While Rack support is built into the main Aker gem, Rails support (for
|
198
|
+
both Rails 2.3 and 3.x) is in a separate gem plugin. See the README
|
199
|
+
in the [`aker-rails` gem][aker-rails] for more information about it.
|
200
|
+
|
201
|
+
[Rack]: http://rack.rubyforge.org/
|
202
|
+
[aker-rails]: https://github.com/NUBIC/aker-rails
|
203
|
+
|
204
|
+
Aker outside of a Rack app
|
205
|
+
--------------------------
|
206
|
+
|
207
|
+
Aker's authorities are independent of its HTTP integration, so they
|
208
|
+
may be used in any ruby script or application. Here's an example:
|
209
|
+
|
210
|
+
#!/usr/bin/env ruby
|
211
|
+
|
212
|
+
require 'rubygems'
|
213
|
+
require 'aker'
|
214
|
+
|
215
|
+
Aker.configure {
|
216
|
+
authorities :ldap, :static
|
217
|
+
central "/etc/nubic/aker-staging.yml"
|
218
|
+
}
|
219
|
+
|
220
|
+
u = Aker.authority.valid_credentials?(:user, 'wakibbe', 'ekibder')
|
221
|
+
# => valid_credentials? returns a Aker::User on success
|
222
|
+
|
223
|
+
if !u
|
224
|
+
$stderr.puts "Bad credentials"
|
225
|
+
exit(1)
|
226
|
+
elsif u.permit?('Admin')
|
227
|
+
lookedup = Aker.authority.find_user(ARGV[0])
|
228
|
+
if lookedup
|
229
|
+
puts "#{ARGV[0]} is the username of #{lookedup.full_name}"
|
230
|
+
else
|
231
|
+
puts "#{ARGV[0]} isn't a valid username"
|
232
|
+
end
|
233
|
+
else
|
234
|
+
$stderr.puts "Unauthorized"
|
235
|
+
exit(2)
|
236
|
+
end
|
237
|
+
|
238
|
+
See the rest of the API documentation for more information.
|
239
|
+
|
240
|
+
Extending Aker
|
241
|
+
--------------
|
242
|
+
|
243
|
+
Aker was built for extensibility. Here are the highlights; see the
|
244
|
+
relevant sections above for more.
|
245
|
+
|
246
|
+
* {Aker::Authorities::Composite#valid_credentials? Authentication} and
|
247
|
+
{Aker::Authorities::Composite#amplify! authorization} can be
|
248
|
+
provided by implementing an {Aker::Authorities authority}. An
|
249
|
+
application can configure in multiple authorities and their results
|
250
|
+
will be intelligently combined. Authorities can also implement
|
251
|
+
{Aker::Authorities::Composite#on_authentication_success success} and
|
252
|
+
{Aker::Authorities::Composite#on_authentication_failure failure}
|
253
|
+
callbacks to provide for auditing or
|
254
|
+
{Aker::Authorities::Composite#veto? lockout} features.
|
255
|
+
* An HTTP-based credential presentation mechanism can be implemented
|
256
|
+
as a {Aker::Modes mode}. E.g., you would write a mode to adapt to a
|
257
|
+
legacy single-sign-on system.
|
258
|
+
* Authorities and modes can be customized through
|
259
|
+
{Aker::Configuration#parameters_for parameters} included in the
|
260
|
+
{Aker::Configuration configuration}.
|
261
|
+
* Reusable extensions can be packaged as gems and registered alongside
|
262
|
+
Aker's built-in functionality. Extensions may use
|
263
|
+
{Aker::Configuration::Slice slices} to register themselves, set
|
264
|
+
defaults parameter values, and register middleware that will be
|
265
|
+
included relative to Aker's own middleware.
|
266
|
+
|
267
|
+
Limitations
|
268
|
+
-----------
|
269
|
+
|
270
|
+
Aker's original iteration was a rails plugin built to assist the
|
271
|
+
Northwestern University Biomedical Informatics Center in transitioning
|
272
|
+
legacy systems to Ruby on Rails. Since then it's been used in dozens
|
273
|
+
of applications, both ports of existing systems and ones newly
|
274
|
+
built.
|
275
|
+
|
276
|
+
While it can be adapted to many kinds of applications, it is probably
|
277
|
+
not a good choice if you are not integrating with an existing
|
278
|
+
authentication or authorization backend. It does not include any
|
279
|
+
mechanism for provisioning users or letting users sign up for accounts
|
280
|
+
on their own. Such things could be built for it, but if that's what
|
281
|
+
you need then one of the other existing ruby security frameworks might
|
282
|
+
get you up and running faster.
|
@@ -0,0 +1,73 @@
|
|
1
|
+
html {
|
2
|
+
background-color: #393939;
|
3
|
+
font-size: 12px;
|
4
|
+
font-family: Helvetica, Arial, sans-serif;
|
5
|
+
margin: 0; padding: 0;
|
6
|
+
}
|
7
|
+
p.error {
|
8
|
+
text-align: center;
|
9
|
+
background-color: #c66;
|
10
|
+
color: #333;
|
11
|
+
margin: 1em 0;
|
12
|
+
padding: 1em;
|
13
|
+
font-size: 1.3em;
|
14
|
+
}
|
15
|
+
.access {
|
16
|
+
display: block;
|
17
|
+
margin: 2em 0;
|
18
|
+
border: solid #000;
|
19
|
+
border-width: 2px 0;
|
20
|
+
background-color: #999;
|
21
|
+
color: #fff;
|
22
|
+
width: 100%
|
23
|
+
}
|
24
|
+
.access .contents {
|
25
|
+
width: 24em;
|
26
|
+
margin: 0 auto;
|
27
|
+
}
|
28
|
+
.access h1 {
|
29
|
+
text-align: center;
|
30
|
+
font-size: 1.5em;
|
31
|
+
margin: 1em;
|
32
|
+
padding: 0;
|
33
|
+
}
|
34
|
+
.access a {
|
35
|
+
color: #fff;
|
36
|
+
}
|
37
|
+
.access a:visited {
|
38
|
+
color: #eed;
|
39
|
+
}
|
40
|
+
.access a:hover {
|
41
|
+
color: #fff;
|
42
|
+
background-color: #aa9;
|
43
|
+
}
|
44
|
+
.access .row {
|
45
|
+
margin: 0.5em;
|
46
|
+
}
|
47
|
+
.access .row:after {
|
48
|
+
display: block;
|
49
|
+
content: " ";
|
50
|
+
clear: both;
|
51
|
+
visibility: hidden;
|
52
|
+
height: 0;
|
53
|
+
}
|
54
|
+
.access .label {
|
55
|
+
text-align: right;
|
56
|
+
height: 2em;
|
57
|
+
font-weight: bold;
|
58
|
+
float: left;
|
59
|
+
width: 6em;
|
60
|
+
padding-top: 6px;
|
61
|
+
}
|
62
|
+
.access .value {
|
63
|
+
margin-left: 6.5em;
|
64
|
+
}
|
65
|
+
.access .text {
|
66
|
+
border: 1px solid #393939;
|
67
|
+
padding: 2px;
|
68
|
+
}
|
69
|
+
.access .button {
|
70
|
+
border: 1px outset #393939;
|
71
|
+
background-color: #393939;
|
72
|
+
color: #ddd;
|
73
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Please log in</title>
|
5
|
+
<link rel="stylesheet" type="text/css" href="<%= login_base %>/login.css" />
|
6
|
+
</head>
|
7
|
+
<body class="access">
|
8
|
+
<form method="POST" action="<%= login_base %>">
|
9
|
+
<input type="hidden" name="url" value="<%= options[:url] %>" />
|
10
|
+
<% if options[:logged_out] %>
|
11
|
+
<h1>Logged out</h1>
|
12
|
+
<% else %>
|
13
|
+
<h1>Please log in</h1>
|
14
|
+
<% end %>
|
15
|
+
<% if options[:login_failed] %>
|
16
|
+
<p class="error">Login failed</p>
|
17
|
+
<% elsif options[:session_expired] %>
|
18
|
+
<p class="error">Session expired</p>
|
19
|
+
<% end %>
|
20
|
+
<div class="contents">
|
21
|
+
<div class="row">
|
22
|
+
<div class="label">
|
23
|
+
<label for="username">Username</label>
|
24
|
+
</div>
|
25
|
+
<div class="value">
|
26
|
+
<input type="text" id="username" name="username" class="text" value="<%= escape_html(options[:username]) %>"/>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
<div class="row">
|
30
|
+
<div class="label">
|
31
|
+
<label for="password">Password</label>
|
32
|
+
</div>
|
33
|
+
<div class="value">
|
34
|
+
<input type="password" id="password" name="password" class="text" />
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<div class="row">
|
38
|
+
<div class="value">
|
39
|
+
<input type="submit" value="Log in" class="button" />
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</body>
|
44
|
+
</html>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'aker'
|
2
|
+
|
3
|
+
module Aker::Authorities
|
4
|
+
##
|
5
|
+
# An authority which grants all users access to the Aker
|
6
|
+
# environment's configured portal. This allows you to mix
|
7
|
+
# authentication-only access control and group-authorization access
|
8
|
+
# control in the same application.
|
9
|
+
#
|
10
|
+
# This authority does not provide any credential validation, so it
|
11
|
+
# can't be used on its own. Combine it with one of the
|
12
|
+
# {Aker::Authorities others}.
|
13
|
+
#
|
14
|
+
# If you only need authentication-only access control, it will be
|
15
|
+
# easier to just omit the {Aker::Configuration#portal portal} from
|
16
|
+
# your aker configuration.
|
17
|
+
class AutomaticAccess
|
18
|
+
def initialize(configuration)
|
19
|
+
unless configuration.portal?
|
20
|
+
raise "#{self.class.to_s.split('::').last} is unnecessary " <<
|
21
|
+
"if you don't have a portal configured."
|
22
|
+
end
|
23
|
+
@portal = configuration.portal
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# Adds the configured portal to the user if necessary.
|
28
|
+
#
|
29
|
+
# @return [Aker::User]
|
30
|
+
def amplify!(user)
|
31
|
+
user.portals << @portal unless user.portals.include?(@portal)
|
32
|
+
user.default_portal = @portal unless user.default_portal
|
33
|
+
user
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|