rack-cas 0.13.0 → 0.14.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 +4 -4
- data/README.md +47 -4
- data/lib/rack-cas/cas_request.rb +2 -0
- data/lib/rack-cas/configuration.rb +4 -3
- data/lib/rack-cas/session_store/active_record.rb +19 -3
- data/lib/rack-cas/session_store/mongoid.rb +19 -3
- data/lib/rack-cas/session_store/rack/active_record.rb +10 -0
- data/lib/rack-cas/version.rb +1 -1
- data/lib/rack/cas.rb +15 -4
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: daf9d3dbf75e0d6a514a5385e4eac0d3d9c892b7
|
4
|
+
data.tar.gz: 53e90cefe8b5aeaa46f417cb989fbc8a41452af4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8869d32aef929055c0ce13d90c064a794512f52aaae28512357c875e50940df1e94f9f7ae5f2e2289e306ca9ebc6ab56e0044ea6583b2e2cd0c68919609eeb6
|
7
|
+
data.tar.gz: c73417fcef8ab4db3912b9fad3d9c090418c4ee47fffb5f3a88fa40e7615ab99e9aa704d49acfdc42c012872de97516965128f0c67eb09fe6b6bea5fc80ce328
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Rack-CAS [](https://travis-ci.org/biola/rack-cas) [](https://badge.fury.io/rb/rack-cas)
|
2
2
|
========
|
3
3
|
Rack-CAS is simple [Rack](http://rack.github.com/) middleware to perform [CAS](http://en.wikipedia.org/wiki/Central_Authentication_Service) client authentication.
|
4
4
|
|
@@ -20,7 +20,7 @@ Requirements
|
|
20
20
|
============
|
21
21
|
* Ruby >= 1.9.2
|
22
22
|
* A working [CAS server](http://casino.rbcas.com)
|
23
|
-
* An app that [returns a `401 Unauthorized`](#integration) status when authentication is
|
23
|
+
* An app that [returns a `401 Unauthorized`](#integration) status when authentication is required
|
24
24
|
|
25
25
|
Installation
|
26
26
|
============
|
@@ -38,7 +38,7 @@ If the the server URL depends on your environment, you can define it in the acco
|
|
38
38
|
|
39
39
|
### Single Logout ###
|
40
40
|
|
41
|
-
If you wish to enable [single logout](http://
|
41
|
+
If you wish to enable [single logout](http://apereo.github.io/cas/4.0.x/installation/Logout-Single-Signout.html) you'll need to modify your configuration as below.
|
42
42
|
|
43
43
|
#### Active Record ####
|
44
44
|
|
@@ -83,7 +83,27 @@ See the [example Sinatra app](https://gist.github.com/adamcrown/a7e7577594690335
|
|
83
83
|
|
84
84
|
### Single Sign Out ###
|
85
85
|
|
86
|
-
|
86
|
+
You will need to store sessions in session store supported by Rack CAS.
|
87
|
+
|
88
|
+
#### Active Record ####
|
89
|
+
Add a migration that looks roughly like
|
90
|
+
|
91
|
+
class AddSessionStore < ActiveRecord::Migration
|
92
|
+
def change
|
93
|
+
create_table :sessions do |t|
|
94
|
+
t.string :cas_ticket
|
95
|
+
t.string :session_id
|
96
|
+
t.text :data
|
97
|
+
t.datetime :created_at
|
98
|
+
t.datetime :updated_at
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
Then use the middleware with
|
104
|
+
|
105
|
+
require 'rack-cas/session-store/rack/active_record'
|
106
|
+
use Rack::Session::RackCASActiveRecordStore
|
87
107
|
|
88
108
|
Configuration
|
89
109
|
=============
|
@@ -111,6 +131,29 @@ The same options can be passed to `FakeCAS`.
|
|
111
131
|
use Rack::FakeCAS, exclude_path: '/api'
|
112
132
|
```
|
113
133
|
|
134
|
+
Excluding Requests
|
135
|
+
------------------
|
136
|
+
|
137
|
+
If the path exclusion is not suitable to ignore the CAS authentication in some parts of your app, you can pass
|
138
|
+
`exclude_request_validator` to the middleware with a custom validator. You need to pass a `Proc` object that will accept
|
139
|
+
a `Rack::Request` object as a parameter.
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
use Rack::CAS, server_url: '...', exclude_request_validator: Proc.new { |req| req.env['HTTP_CONTENT_TYPE'] == 'application/json' }
|
143
|
+
```
|
144
|
+
|
145
|
+
Ignore 401 Intercept
|
146
|
+
--------------------
|
147
|
+
|
148
|
+
For some requests you might want to ignore the 401 intercept made by the middleware. For example when we want CAS to
|
149
|
+
authenticate API requests but leave the redirect handling to the client. For this you can use the
|
150
|
+
`ignore_intercept_validator`. You need to pass a `Proc` object that will accept a `Rack::Request` object as a parameter.
|
151
|
+
|
152
|
+
```ruby
|
153
|
+
use Rack::CAS, server_url: '...', ignore_intercept_validator: Proc.new { |req| req.env['HTTP_CONTENT_TYPE'] == 'application/json' }
|
154
|
+
use Rack::CAS, server_url: '...', ignore_intercept_validator: Proc.new { |req| req.env['PATH_INFO'] =~ 'api' }
|
155
|
+
```
|
156
|
+
|
114
157
|
SSL Cert Verification
|
115
158
|
---------------------
|
116
159
|
|
data/lib/rack-cas/cas_request.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module RackCAS
|
2
2
|
class Configuration
|
3
|
-
SETTINGS = [:fake, :server_url, :session_store, :exclude_path, :exclude_paths, :extra_attributes_filter,
|
3
|
+
SETTINGS = [:fake, :server_url, :session_store, :exclude_path, :exclude_paths, :extra_attributes_filter,
|
4
|
+
:verify_ssl_cert, :renew, :use_saml_validation, :ignore_intercept_validator, :exclude_request_validator]
|
4
5
|
|
5
6
|
SETTINGS.each do |setting|
|
6
7
|
attr_accessor setting
|
7
8
|
|
8
9
|
define_method "#{setting}?" do
|
9
|
-
!
|
10
|
+
![nil, false, []].include? send(setting)
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
@@ -24,7 +25,7 @@ module RackCAS
|
|
24
25
|
raise ArgumentError, "invalid setting: #{setting}"
|
25
26
|
end
|
26
27
|
|
27
|
-
|
28
|
+
public_send "#{setting}=", value
|
28
29
|
end
|
29
30
|
|
30
31
|
raise ArgumentError, 'server_url is required' unless server_url?
|
@@ -15,7 +15,8 @@ module RackCAS
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
|
18
|
+
# Rack 2.0 method
|
19
|
+
def find_session(env, sid)
|
19
20
|
if sid.nil?
|
20
21
|
sid = generate_sid
|
21
22
|
data = nil
|
@@ -31,7 +32,8 @@ module RackCAS
|
|
31
32
|
[sid, data]
|
32
33
|
end
|
33
34
|
|
34
|
-
|
35
|
+
# Rack 2.0 method
|
36
|
+
def write_session(req, sid, session_data, options)
|
35
37
|
cas_ticket = (session_data['cas']['ticket'] unless session_data['cas'].nil?)
|
36
38
|
|
37
39
|
session = if ActiveRecord.respond_to?(:version) && ActiveRecord.version >= Gem::Version.new('4.0.0')
|
@@ -46,12 +48,26 @@ module RackCAS
|
|
46
48
|
success ? session.session_id : false
|
47
49
|
end
|
48
50
|
|
49
|
-
|
51
|
+
# Rack 2.0 method
|
52
|
+
def delete_session(req, sid, options)
|
50
53
|
Session.where(session_id: sid).delete_all
|
51
54
|
|
52
55
|
options[:drop] ? nil : generate_sid
|
53
56
|
end
|
54
57
|
|
58
|
+
# Rack 1.* method
|
59
|
+
alias get_session find_session
|
60
|
+
|
61
|
+
# Rack 1.* method
|
62
|
+
def set_session(env, sid, session_data, options) # rack 1.x compatibilty
|
63
|
+
write_session(Rack::Request.new(env), sid, session_data, options)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Rack 1.* method
|
67
|
+
def destroy_session(env, sid, options) # rack 1.x compatibilty
|
68
|
+
delete_session(Rack::Request.new(env), sid, options)
|
69
|
+
end
|
70
|
+
|
55
71
|
def pack(data)
|
56
72
|
::Base64.encode64(Marshal.dump(data)) if data
|
57
73
|
end
|
@@ -27,7 +27,8 @@ module RackCAS
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
|
30
|
+
# Rack 2.0 method
|
31
|
+
def find_session(env, sid)
|
31
32
|
if sid.nil?
|
32
33
|
sid = generate_sid
|
33
34
|
data = nil
|
@@ -43,7 +44,8 @@ module RackCAS
|
|
43
44
|
[sid, data]
|
44
45
|
end
|
45
46
|
|
46
|
-
|
47
|
+
# Rack 2.0 method
|
48
|
+
def write_session(env, sid, session_data, options)
|
47
49
|
cas_ticket = (session_data['cas']['ticket'] unless session_data['cas'].nil?)
|
48
50
|
|
49
51
|
session = Session.find_or_initialize_by(_id: sid)
|
@@ -52,12 +54,26 @@ module RackCAS
|
|
52
54
|
success ? session.id : false
|
53
55
|
end
|
54
56
|
|
55
|
-
|
57
|
+
# Rack 2.0 method
|
58
|
+
def delete_session(env, sid, options)
|
56
59
|
Session.where(_id: sid).delete
|
57
60
|
|
58
61
|
options[:drop] ? nil : generate_sid
|
59
62
|
end
|
60
63
|
|
64
|
+
# Rack 1.* method
|
65
|
+
alias get_session find_session
|
66
|
+
|
67
|
+
# Rack 1.* method
|
68
|
+
def set_session(env, sid, session_data, options) # rack 1.x compatibilty
|
69
|
+
write_session(Rack::Request.new(env), sid, session_data, options)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Rack 1.* method
|
73
|
+
def destroy_session(env, sid, options) # rack 1.x compatibilty
|
74
|
+
delete_session(Rack::Request.new(env), sid, options)
|
75
|
+
end
|
76
|
+
|
61
77
|
def pack(data)
|
62
78
|
if defined? Moped::BSON
|
63
79
|
Moped::BSON::Binary.new(:generic, Marshal.dump(data))
|
data/lib/rack-cas/version.rb
CHANGED
data/lib/rack/cas.rb
CHANGED
@@ -16,9 +16,7 @@ class Rack::CAS
|
|
16
16
|
request = Rack::Request.new(env)
|
17
17
|
cas_request = CASRequest.new(request)
|
18
18
|
|
19
|
-
|
20
|
-
return @app.call(env)
|
21
|
-
end
|
19
|
+
return @app.call(env) if exclude_request?(cas_request)
|
22
20
|
|
23
21
|
if cas_request.ticket_validation?
|
24
22
|
log env, 'rack-cas: Intercepting ticket validation request.'
|
@@ -51,7 +49,7 @@ class Rack::CAS
|
|
51
49
|
|
52
50
|
response = @app.call(env)
|
53
51
|
|
54
|
-
if response[0] == 401 # access denied
|
52
|
+
if response[0] == 401 && !ignore_intercept?(request) # access denied
|
55
53
|
log env, 'rack-cas: Intercepting 401 access denied response. Redirecting to CAS login.'
|
56
54
|
|
57
55
|
redirect_to server.login_url(request.url).to_s
|
@@ -66,6 +64,19 @@ class Rack::CAS
|
|
66
64
|
@server ||= RackCAS::Server.new(RackCAS.config.server_url)
|
67
65
|
end
|
68
66
|
|
67
|
+
def ignore_intercept?(request)
|
68
|
+
return false if (validator = RackCAS.config.ignore_intercept_validator).nil?
|
69
|
+
validator.call(request)
|
70
|
+
end
|
71
|
+
|
72
|
+
def exclude_request?(cas_request)
|
73
|
+
if (validator = RackCAS.config.exclude_request_validator)
|
74
|
+
validator.call(cas_request.request)
|
75
|
+
else
|
76
|
+
cas_request.path_matches? RackCAS.config.exclude_path || RackCAS.config.exclude_paths
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
69
80
|
def get_user(service_url, ticket)
|
70
81
|
server.validate_service(service_url, ticket)
|
71
82
|
end
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-cas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Crownoble
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -84,14 +84,14 @@ dependencies:
|
|
84
84
|
name: rack-test
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0.6'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.6'
|
97
97
|
- !ruby/object:Gem::Dependency
|
@@ -127,6 +127,7 @@ files:
|
|
127
127
|
- lib/rack-cas/service_validation_response.rb
|
128
128
|
- lib/rack-cas/session_store/active_record.rb
|
129
129
|
- lib/rack-cas/session_store/mongoid.rb
|
130
|
+
- lib/rack-cas/session_store/rack/active_record.rb
|
130
131
|
- lib/rack-cas/session_store/rack/mongoid.rb
|
131
132
|
- lib/rack-cas/session_store/rails/active_record.rb
|
132
133
|
- lib/rack-cas/session_store/rails/mongoid.rb
|
@@ -160,3 +161,4 @@ signing_key:
|
|
160
161
|
specification_version: 4
|
161
162
|
summary: Rack-based CAS client
|
162
163
|
test_files: []
|
164
|
+
has_rdoc:
|