rack-cas 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -6,7 +6,7 @@ Features
6
6
  ========
7
7
  * __Rack based__
8
8
  * __Framework independent__
9
- Works with but doesn't depend on Rails, Sinatra, etc.
9
+ Works with, but doesn't depend on Rails, Sinatra, etc.
10
10
  * __Minimal dependencies__
11
11
  Current gem dependencies are [rack](http://rubygems.org/gems/rack), [addressable](http://rubygems.org/gems/addressable) and [nokogiri](http://rubygems.org/gems/nokogiri).
12
12
  * __Supports CAS extra attributes__
@@ -14,10 +14,6 @@ Extra attributes are a mess though. So let me know if your brand of CAS server i
14
14
  * __Single sign out__
15
15
  One of the included session stores must be used.
16
16
 
17
- Coming Soon
18
- ===========
19
- * __Single sign out compatible session store for Active Record__
20
-
21
17
  Requirements
22
18
  ============
23
19
  * Ruby >= 1.9.2
@@ -26,38 +22,68 @@ Requirements
26
22
  Installation
27
23
  ============
28
24
 
29
- gem install rack-cas
25
+ Rails
26
+ -----
27
+
28
+ Add `gem 'rack-cas'` to your [`Gemfile`](http://gembundler.com/gemfile.html) and run `bundle install`
29
+
30
+ Create `config/initializers/rack-cas.rb` with the following:
31
+
32
+ require 'rack/cas'
33
+ YourApp::Application.config.middleware.use Rack::CAS, server_url: 'https://login.example.com/cas'
34
+
35
+ ### Single Sign Out ###
30
36
 
31
- Or for [Bundler](http://gembundler.com):
37
+ If you wish to enable [single sign out](https://wiki.jasig.org/display/CASUM/Single+Sign+Out) you'll need to modify your configuration as below.
32
38
 
33
- gem 'rack-cas'
39
+ #### Active Record ####
34
40
 
35
- Then in your `config.ru` file add
41
+ Set the `session_store` in `config/initialiers/rack-cas.rb`
36
42
 
37
43
  require 'rack/cas'
38
- use Rack::CAS, server_url: 'https://login.example.com/cas'
44
+ require 'rack-cas/session_store/active_record'
45
+ YourApp::Application.config.middleware.use Rack::CAS,
46
+ server_url: 'https://login.example.com/cas',
47
+ session_store: RackCAS::ActiveRecordStore
48
+
49
+ Edit your `config/initializers/session_store.rb` file with the following:
50
+
51
+ require 'rack-cas/session_store/rails/active_record'
52
+ YourApp::Application.config.session_store :rack_cas_active_record_store
39
53
 
40
- Single Sign Out
41
- ---------------
42
- Support for [single sign out](https://wiki.jasig.org/display/CASUM/Single+Sign+Out) requires the use of one of the included session stores listed below.
54
+ Run:
43
55
 
44
- * Mongoid
56
+ rails generate cas_session_store_migration
57
+ rake db:migrate
45
58
 
46
- To use the session store with Rails add the following to your `config/initializers/session_store.rb` file:
59
+ #### Mongoid ####
60
+
61
+ Set the `session_store` in `config/initialiers/rack-cas.rb`
62
+
63
+ require 'rack/cas'
64
+ require 'rack-cas/session_store/mongoid'
65
+ YourApp::Application.config.middleware.use Rack::CAS,
66
+ server_url: 'https://login.example.com/cas',
67
+ session_store: RackCAS::MongoidStore
68
+
69
+ Edit your `config/initializers/session_store.rb` file with the following:
47
70
 
48
71
  require 'rack-cas/session_store/rails/mongoid'
49
- YourApp::Application.config.session_store :mongoid_store
72
+ YourApp::Application.config.session_store :rack_cas_mongoid_store
50
73
 
51
- For other Rack-compatible frameworks, add the following to your config.ru file:
74
+ Sinatra and Other Rack-Compatible Frameworks
75
+ --------------------------------------------
52
76
 
53
- requre 'rack-cas/sessions_store/rack/mongoid'
54
- use Rack::Session::MongoidStore
77
+ Add `gem 'rack-cas'` to your [`Gemfile`](http://gembundler.com/gemfile.html) and run `bundle install`
55
78
 
56
- Then tell the RackCAS where to find your sessions:
79
+ Add the following to your `config.ru` file:
57
80
 
58
81
  require 'rack/cas'
59
- require 'rack-cas/session_store/mongoid'
60
- use Rack::CAS server_url: 'http://login.example.com/cas', session_store: RackCAS:MongoidStore
82
+ use Rack::CAS, server_url: 'https://login.example.com/cas'
83
+
84
+ ### Single Sign Out ###
85
+
86
+ Single sign out support outside of Rails is currently untested. We'll be adding instructions here soon.
61
87
 
62
88
  Integration
63
89
  ===========
@@ -0,0 +1,26 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+
4
+ class CasSessionStoreMigrationGenerator < Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+
7
+ desc 'Creates a new CAS session store migration file'
8
+
9
+ def self.source_root
10
+ File.expand_path('../templates', __FILE__)
11
+ end
12
+
13
+ def self.next_migration_number(dirname)
14
+ if ActiveRecord::Base.timestamped_migrations
15
+ migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
16
+ migration_number += 1
17
+ migration_number.to_s
18
+ else
19
+ "%.3d" % (current_migration_number(dirname) + 1)
20
+ end
21
+ end
22
+
23
+ def create_migration_file
24
+ migration_template 'migration.rb', 'db/migrate/create_rack_cas_sessions'
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ class CreateRackCasSessions < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :sessions do |t|
4
+ t.string :session_id, :null => false
5
+ t.string :cas_ticket
6
+ t.text :data
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :sessions, :session_id
11
+ add_index :sessions, :cas_ticket
12
+ add_index :sessions, :updated_at
13
+ end
14
+
15
+ def self.down
16
+ drop_table :sessions
17
+ end
18
+ end
@@ -7,10 +7,8 @@ class CASRequest
7
7
 
8
8
  def ticket
9
9
  @ticket ||= if single_sign_out?
10
- xml = Nokogiri::XML(@request.params['logoutRequest']).tap do |xml|
11
- xml.remove_namespaces!
12
- end
13
- node = xml.at('/LogoutRequest/SessionIndex')
10
+ xml = Nokogiri::XML(@request.params['logoutRequest'])
11
+ node = xml.root.children.find { |c| c.name =~ /SessionIndex/i }
14
12
  node.text unless node.nil?
15
13
  else
16
14
  @request.params['ticket']
@@ -0,0 +1,49 @@
1
+ module RackCAS
2
+ module ActiveRecordStore
3
+ class Session < ActiveRecord::Base
4
+ attr_accessible :id, :data, :cas_ticket
5
+ end
6
+
7
+ def self.destroy_session_by_cas_ticket(cas_ticket)
8
+ affected = Session.delete_all(cas_ticket: cas_ticket)
9
+ affected == 1
10
+ end
11
+
12
+ private
13
+
14
+ def get_session(env, sid)
15
+ if sid.nil?
16
+ sid = generate_sid
17
+ data = nil
18
+ else
19
+ session = Session.where(session_id: sid).first || {}
20
+ data = unpack(session['data'])
21
+ end
22
+
23
+ [sid, data]
24
+ end
25
+
26
+ def set_session(env, sid, session_data, options)
27
+ cas_ticket = (session_data['cas']['ticket'] unless session_data['cas'].nil?)
28
+
29
+ session = Session.find_or_initialize_by_session_id(sid)
30
+ success = session.update_attributes(data: pack(session_data), cas_ticket: cas_ticket)
31
+
32
+ success ? session.session_id : false
33
+ end
34
+
35
+ def destroy_session(env, sid, options)
36
+ session = Session.where(session_id: sid).delete
37
+
38
+ options[:drop] ? nil : generate_sid
39
+ end
40
+
41
+ def pack(data)
42
+ ::Base64.encode64(Marshal.dump(data)) if data
43
+ end
44
+
45
+ def unpack(data)
46
+ Marshal.load(::Base64.decode64(data)) if data
47
+ end
48
+ end
49
+ end
@@ -3,7 +3,7 @@ require 'rack/session/abstract/id'
3
3
 
4
4
  module Rack
5
5
  module Session
6
- class MongoStore < Rack::Session::Abstract::ID
6
+ class RackCASMongoStore < Rack::Session::Abstract::ID
7
7
  include RackCAS::MongoStore
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ require 'rack/session/abstract/id'
3
3
 
4
4
  module Rack
5
5
  module Session
6
- class MongoidStore < Rack::Session::Abstract::ID
6
+ class RackCASMongoidStore < Rack::Session::Abstract::ID
7
7
  include RackCAS::MongoidStore
8
8
  end
9
9
  end
@@ -0,0 +1,10 @@
1
+ require 'rack-cas/session_store/active_record'
2
+ require 'action_dispatch/middleware/session/abstract_store'
3
+
4
+ module ActionDispatch
5
+ module Session
6
+ class RackCasActiveRecordStore < AbstractStore
7
+ include RackCAS::ActiveRecordStore
8
+ end
9
+ end
10
+ end
@@ -3,7 +3,7 @@ require 'action_dispatch/middleware/session/abstract_store'
3
3
 
4
4
  module ActionDispatch
5
5
  module Session
6
- class MongoStore < AbstractStore
6
+ class RackCasMongoStore < AbstractStore
7
7
  include RackCAS::MongoStore
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ require 'action_dispatch/middleware/session/abstract_store'
3
3
 
4
4
  module ActionDispatch
5
5
  module Session
6
- class MongoidStore < AbstractStore
6
+ class RackCasMongoidStore < AbstractStore
7
7
  include RackCAS::MongoidStore
8
8
  end
9
9
  end
@@ -1,3 +1,3 @@
1
1
  module RackCAS
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-cas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-17 00:00:00.000000000 Z
12
+ date: 2012-10-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -67,12 +67,16 @@ extra_rdoc_files: []
67
67
  files:
68
68
  - README.markdown
69
69
  - MIT-LICENSE
70
+ - lib/generators/templates/migration.rb
71
+ - lib/generators/cas_session_store_migration_generator.rb
70
72
  - lib/rack-cas.rb
71
73
  - lib/rack-cas/url.rb
72
74
  - lib/rack-cas/version.rb
73
75
  - lib/rack-cas/session_store/rails/mongo.rb
76
+ - lib/rack-cas/session_store/rails/active_record.rb
74
77
  - lib/rack-cas/session_store/rails/mongoid.rb
75
78
  - lib/rack-cas/session_store/mongo.rb
79
+ - lib/rack-cas/session_store/active_record.rb
76
80
  - lib/rack-cas/session_store/rack/mongo.rb
77
81
  - lib/rack-cas/session_store/rack/mongoid.rb
78
82
  - lib/rack-cas/session_store/mongoid.rb