aker 3.0.0.pre
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/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
|