devise_cas_authenticatable 1.0.0.alpha1

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/.project ADDED
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projectDescription>
3
+ <name>devise_cas_authenticatable</name>
4
+ <comment></comment>
5
+ <projects>
6
+ </projects>
7
+ <buildSpec>
8
+ </buildSpec>
9
+ <natures>
10
+ <nature>org.radrails.rails.core.railsnature</nature>
11
+ </natures>
12
+ </projectDescription>
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ devise_cas_authenticatable
2
+ ==========================
3
+
4
+ Written by Nat Budin<br/>
5
+ Taking a lot of inspiration from [devise_ldap_authenticatable](http://github.com/cschiewek/devise_ldap_authenticatable)
6
+
7
+ devise_cas_authenticatable is [CAS](http://www.jasig.org/cas) single sign-on support for
8
+ [Devise](http://github.com/plataformatec/devise) applications. It acts as a replacement for
9
+ database_authenticatable. It builds on [rubycas-client](http://github.com/gunark/rubycas-client)
10
+ and should support just about any conformant CAS server (although I have personally tested it
11
+ using [rubycas-server](http://github.com/gunark/rubycas-server)).
12
+
13
+ Requirements
14
+ ------------
15
+
16
+ - Rails 2.3
17
+ - Devise 1.0 (tested on 1.0.6)
18
+ - rubycas-client 2.1
19
+
20
+ Installation
21
+ ------------
22
+
23
+ gem install --pre devise_cas_authenticatable
24
+
25
+ and in your config/environment.rb:
26
+
27
+ config.gem 'devise_cas_authenticatable'
28
+
29
+ Setup
30
+ -----
31
+
32
+ Once devise\_cas\_authenticatable is installed, add the following to your user model:
33
+
34
+ devise :cas_authenticatable
35
+
36
+ You can also add other modules such as token_authenticatable, trackable, etc. Please do not
37
+ add database_authenticatable as this module is intended to replace it.
38
+
39
+ You'll also need to set up the database schema for this:
40
+
41
+ create_table :users do |t|
42
+ t.cas_authenticatable
43
+ end
44
+
45
+ and, optionally, indexes:
46
+
47
+ add_index :username, :unique => true
48
+
49
+ Finally, you'll need to add some configuration to your config/initializers/devise.rb in order
50
+ to tell your app how to talk to your CAS server:
51
+
52
+ Devise.setup do |config|
53
+ ...
54
+ config.cas_base_url = "https://cas.myorganization.com"
55
+
56
+ # you can override these if you need to, but cas_base_url is usually enough
57
+ # config.cas_login_url = "https://cas.myorganization.com/login"
58
+ # config.cas_logout_url = "https://cas.myorganization.com/logout"
59
+ # config.cas_validate_url = "https://cas.myorganization.com/serviceValidate"
60
+
61
+ # By default, devise_cas_authenticatable will create users. If you would rather
62
+ # require user records to already exist locally before they can authenticate via
63
+ # CAS, uncomment the following line.
64
+ # config.cas_create_user = false
65
+ end
66
+
67
+ Extra attributes
68
+ ----------------
69
+
70
+ If your CAS server passes along extra attributes you'd like to save in your user records,
71
+ using the CAS extra_attributes parameter, you can define a method in your user model called
72
+ cas_extra_attributes= to accept these. For example:
73
+
74
+ class User < ActiveRecord::Base
75
+ devise :cas_authenticatable
76
+
77
+ def cas_extra_attributes=(extra_attributes)
78
+ extra_attributes.each do |name, value|
79
+ case name.to_sym
80
+ when :fullname
81
+ self.fullname = value
82
+ when :email
83
+ self.email = value
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ See also
90
+ --------
91
+
92
+ * [CAS](http://www.jasig.org/cas)
93
+ * [rubycas-server](http://github.com/gunark/rubycas-server)
94
+ * [rubycas-client](http://github.com/gunark/rubycas-client)
95
+ * [Devise](http://github.com/plataformatec/devise)
96
+ * [Warden](http://github.com/hassox/warden)
97
+
98
+ TODO
99
+ ----
100
+
101
+ * Implement CAS single sign-off support (maybe via a Rack middleware?)
102
+ * Write test suite
103
+ * Test on non-ActiveRecord ORMs
104
+ * Test on Rails 3/Devise 1.1
data/Rakefile ADDED
@@ -0,0 +1,41 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the devise_cas_authenticatable plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc 'Generate documentation for the devise_cas_authenticatable plugin.'
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'devise_cas_authenticatable'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
24
+
25
+
26
+ begin
27
+ require 'jeweler'
28
+ Jeweler::Tasks.new do |gemspec|
29
+ gemspec.name = "devise_cas_authenticatable"
30
+ gemspec.summary = "CAS authentication module for Devise"
31
+ gemspec.description = "CAS authentication module for Devise"
32
+ gemspec.email = "natbudin@gmail.com"
33
+ gemspec.homepage = "http://github.com/nbudin/devise_cas_authenticatable"
34
+ gemspec.authors = ["Nat Budin"]
35
+ gemspec.add_runtime_dependency "devise", "~> 1.0.6"
36
+ gemspec.add_runtime_dependency "rubycas-client", "~> 2.1.0"
37
+ end
38
+ Jeweler::GemcutterTasks.new
39
+ rescue LoadError
40
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
41
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0.alpha1
@@ -0,0 +1,13 @@
1
+ class CasSessionsController < ApplicationController
2
+ prepend_before_filter :require_no_authentication, :only => [:login]
3
+ include Devise::Controllers::InternalHelpers
4
+
5
+ def destroy
6
+ sign_out(resource_name)
7
+ destination = request.protocol
8
+ destination << request.host
9
+ destination << ":#{request.port.to_s}" unless request.port == 80
10
+ destination << after_sign_out_path_for(resource_name)
11
+ redirect_to(::Devise.cas_client.logout_url(destination))
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ module Devise
2
+ module Models
3
+ module CasAuthenticatable
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ def authenticate_with_cas_ticket(ticket)
10
+ ::Devise.cas_client.validate_service_ticket(ticket) unless ticket.has_been_validated?
11
+
12
+ if ticket.is_valid?
13
+ conditions = {:username => ticket.response.user}
14
+ puts conditions.inspect
15
+
16
+ resource = find_for_cas_authentication(conditions)
17
+ resource = new(conditions) if (resource.nil? and ::Devise.cas_create_user)
18
+ return nil unless resource
19
+
20
+ if resource.new_record?
21
+ if resource.respond_to? :cas_extra_attributes=
22
+ resource.cas_extra_attributes = ticket.response.extra_attributes
23
+ end
24
+
25
+ create(conditions)
26
+ else
27
+ if ::Devise.cas_update_user
28
+ if resource.respond_to? :cas_extra_attributes=
29
+ resource.cas_extra_attributes = ticket.response.extra_attributes
30
+ resource.save
31
+ end
32
+ end
33
+
34
+ resource
35
+ end
36
+ end
37
+ end
38
+
39
+ protected
40
+ def find_for_cas_authentication(conditions)
41
+ find(:first, :conditions => conditions)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,9 @@
1
+ ActionController::Routing::RouteSet::Mapper.class_eval do
2
+ protected
3
+
4
+ def cas_authenticatable(routes, mapping)
5
+ routes.with_options(:controller => 'cas_sessions', :name_prefix => nil) do |session|
6
+ session.send(:"destroy_#{mapping.name}_session", mapping.path_names[:sign_out], :action => 'destroy', :conditions => { :method => :get })
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ Devise::Schema.class_eval do
2
+ def cas_authenticatable
3
+ apply_schema :username, String
4
+ end
5
+ end
@@ -0,0 +1,48 @@
1
+ require 'devise/strategies/base'
2
+
3
+ module Devise
4
+ module Strategies
5
+ class CasAuthenticatable < Base
6
+ def valid?
7
+ mapping.to.respond_to?(:authenticate_with_cas_ticket)
8
+ end
9
+
10
+ def authenticate!
11
+ ticket = read_ticket(params)
12
+ if ticket
13
+ if resource = mapping.to.authenticate_with_cas_ticket(ticket)
14
+ success!(resource)
15
+ else
16
+ fail(:invalid)
17
+ end
18
+ elsif returning_from_cas?
19
+ fail(:invalid)
20
+ else
21
+ redirect!(login_url)
22
+ end
23
+ end
24
+
25
+ protected
26
+ def returning_from_cas?
27
+ request.referer =~ /^#{::Devise.cas_client.cas_base_url}/
28
+ end
29
+
30
+ def login_url
31
+ ::Devise.cas_client.add_service_to_login_url(request.url)
32
+ end
33
+
34
+ def read_ticket(params)
35
+ ticket = params[:ticket]
36
+ return nil unless ticket
37
+
38
+ if ticket =~ /^PT-/
39
+ ::CASClient::ProxyTicket.new(ticket, request.url, params[:renew])
40
+ else
41
+ ::CASClient::ServiceTicket.new(ticket, request.url, params[:renew])
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ Warden::Strategies.add(:cas_authenticatable, Devise::Strategies::CasAuthenticatable)
@@ -0,0 +1,38 @@
1
+ require 'devise'
2
+
3
+ require 'devise_cas_authenticatable/schema'
4
+ require 'devise_cas_authenticatable/routes'
5
+ require 'devise_cas_authenticatable/strategy'
6
+
7
+ require 'rubycas-client'
8
+
9
+ module Devise
10
+ mattr_accessor :cas_base_url
11
+ @@cas_base_url = nil
12
+
13
+ mattr_accessor :cas_login_url
14
+ @@cas_login_url = nil
15
+
16
+ mattr_accessor :cas_logout_url
17
+ @@cas_logout_url = nil
18
+
19
+ mattr_accessor :cas_validate_url
20
+ @@cas_validate_url = nil
21
+
22
+ mattr_accessor :cas_create_user
23
+ @@cas_create_user = true
24
+
25
+ def self.cas_client
26
+ @@cas_client ||= CASClient::Client.new(
27
+ :cas_base_url => @@cas_base_url,
28
+ :login_url => @@cas_login_url,
29
+ :logout_url => @@cas_logout_url,
30
+ :validate_url => @@cas_validate_url
31
+ )
32
+ end
33
+ end
34
+
35
+ Devise.add_module(:cas_authenticatable,
36
+ :strategy => true,
37
+ :controller => :cas_sessions,
38
+ :model => 'devise_cas_authenticatable/model')
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require "devise_cas_authenticatable"
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise_cas_authenticatable
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: true
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ - alpha1
10
+ version: 1.0.0.alpha1
11
+ platform: ruby
12
+ authors:
13
+ - Nat Budin
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-05-06 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: devise
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 0
31
+ - 6
32
+ version: 1.0.6
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rubycas-client
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 2
44
+ - 1
45
+ - 0
46
+ version: 2.1.0
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description: CAS authentication module for Devise
50
+ email: natbudin@gmail.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files:
56
+ - README.md
57
+ files:
58
+ - .project
59
+ - README.md
60
+ - Rakefile
61
+ - VERSION
62
+ - app/controllers/cas_sessions_controller.rb
63
+ - lib/devise_cas_authenticatable.rb
64
+ - lib/devise_cas_authenticatable/model.rb
65
+ - lib/devise_cas_authenticatable/routes.rb
66
+ - lib/devise_cas_authenticatable/schema.rb
67
+ - lib/devise_cas_authenticatable/strategy.rb
68
+ - rails/init.rb
69
+ has_rdoc: true
70
+ homepage: http://github.com/nbudin/devise_cas_authenticatable
71
+ licenses: []
72
+
73
+ post_install_message:
74
+ rdoc_options:
75
+ - --charset=UTF-8
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
84
+ version: "0"
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">"
88
+ - !ruby/object:Gem::Version
89
+ segments:
90
+ - 1
91
+ - 3
92
+ - 1
93
+ version: 1.3.1
94
+ requirements: []
95
+
96
+ rubyforge_project:
97
+ rubygems_version: 1.3.6
98
+ signing_key:
99
+ specification_version: 3
100
+ summary: CAS authentication module for Devise
101
+ test_files: []
102
+