Skip to content

Commit f1d6b76

Browse files
committed
Improve ruby-saml routes, views and polish the saml_controller
1 parent 4b192eb commit f1d6b76

File tree

7 files changed

+260
-972
lines changed

7 files changed

+260
-972
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
log/*
2+
tmp/*

app/controllers/saml_controller.rb

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@ class SamlController < ApplicationController
22
skip_before_action :verify_authenticity_token, :only => [:acs, :logout]
33

44
def index
5-
render :action => :index
5+
@attrs = []
66
end
77

88
def sso
99
settings = Account.get_saml_settings
1010
if settings.nil?
1111
render :action => :no_settings
12-
return
12+
return
1313
end
1414

1515
request = OneLogin::RubySaml::Authrequest.new
1616
redirect_to(request.create(settings))
17-
# redirect_to(request.create(saml_settings, {:RelayState => session[:return_to]}))
1817

1918
end
2019

@@ -25,10 +24,10 @@ def acs
2524
logger.info "NAMEID: #{response.name_id}"
2625

2726
if response.is_valid?
28-
session[:userid] = response.name_id
27+
session[:user_id] = response.name_id
2928
session[:attributes] = response.attributes
3029
@attrs = session[:attributes]
31-
render :action => :complete
30+
redirect_to root_path
3231
else
3332
render :action => :fail
3433
end
@@ -42,17 +41,17 @@ def metadata
4241

4342
# Trigger SP and IdP initiated Logout requests
4443
def logout
45-
# If we're given a logout request, handle it in the IdP initiated method
44+
# If we're given a logout request, handle it in the IdP logout initiated method
4645
if params[:SAMLRequest]
4746
return idp_logout_request
48-
49-
# We've been given a response back from the IdP
47+
48+
# We've been given a response back from the IdP
5049
elsif params[:SAMLResponse]
51-
return logout_response
50+
return process_logout_response
5251
elsif params[:slo]
5352
return sp_logout_request
5453
else
55-
delete_session
54+
reset_session
5655
end
5756
end
5857

@@ -63,17 +62,17 @@ def sp_logout_request
6362

6463
if settings.idp_slo_target_url.nil?
6564
logger.info "SLO IdP Endpoint not found in settings, executing then a normal logout'"
66-
delete_session
65+
reset_session
6766
else
6867

6968
# Since we created a new SAML request, save the transaction_id
7069
# to compare it with the response we get back
7170
logout_request = OneLogin::RubySaml::Logoutrequest.new()
7271
session[:transaction_id] = logout_request.uuid
73-
logger.info "New SP SLO for userid '#{session[:userid]}' transactionid '#{session[:transaction_id]}'"
72+
logger.info "New SP SLO for User ID: '#{session[:user_id]}', Transaction ID: '#{session[:transaction_id]}'"
7473

7574
if settings.name_identifier_value.nil?
76-
settings.name_identifier_value = session[:userid]
75+
settings.name_identifier_value = session[:user_id]
7776
end
7877

7978
relayState = url_for controller: 'saml', action: 'index'
@@ -83,12 +82,12 @@ def sp_logout_request
8382

8483
# After sending an SP initiated LogoutRequest to the IdP, we need to accept
8584
# the LogoutResponse, verify it, then actually delete our session.
86-
def logout_response
85+
def process_logout_response
8786
settings = Account.get_saml_settings
8887

8988
if session.has_key? :transation_id
9089
logout_response = OneLogin::RubySaml::Logoutresponse.new(params[:SAMLResponse], settings, :matches_request_id => session[:transation_id])
91-
else
90+
else
9291
logout_response = OneLogin::RubySaml::Logoutresponse.new(params[:SAMLResponse], settings)
9392
end
9493

@@ -100,30 +99,24 @@ def logout_response
10099
else
101100
# Actually log out this session
102101
if logout_response.success?
103-
logger.info "Delete session for '#{session[:userid]}'"
104-
delete_session
102+
logger.info "Delete session for '#{session[:user_id]}'"
103+
reset_session
105104
end
106105
end
107106
end
108107

109108
# Method to handle IdP initiated logouts
110109
def idp_logout_request
111-
112-
render :inline => "IdP initiated Logout not supported"
113-
114-
#settings = Account.get_saml_settings
115-
#logout_request = OneLogin::RubySaml::Logoutrequest.new(params[:SAMLRequest],settings)
116-
#unless logout_request.is_valid?
117-
# logger.error "IdP initiated LogoutRequest was not valid!"
118-
#end
119-
# Check that the name ID's match
120-
#if session[:userid] != logout_request.name_id
121-
# logger.error "The session's Name ID '#{session[:userid]}' does not match the LogoutRequest's Name ID '#{logout_request.name_id}'"
122-
#end
123-
#logger.info "IdP initiated Logout for #{logout_request.name_id}"
110+
settings = Account.get_saml_settings
111+
logout_request = OneLogin::RubySaml::SloLogoutrequest.new(params[:SAMLRequest])
112+
if !logout_request.is_valid?
113+
logger.error "IdP initiated LogoutRequest was not valid!"
114+
render :inline => logger.error
115+
end
116+
logger.info "IdP initiated Logout for #{logout_request.name_id}"
124117

125118
# Actually log out this session
126-
#delete_session
119+
reset_session
127120

128121
# Generate a response to the IdP. :transaction_id sets the InResponseTo
129122
# SAML message to create a reply to the IdP in the LogoutResponse.
@@ -137,13 +130,10 @@ def idp_logout_request
137130
# when "POST"
138131
# # for POST requests (form) render the content as HTML
139132
# render :inline => content
140-
#end
141-
end
133+
#end logout_request_id = logout_request.id
142134

143-
# Delete a user's session. Add your own custom stuff in here
144-
def delete_session
145-
session[:userid] = nil
146-
session[:attributes] = nil
135+
logout_response = OneLogin::RubySaml::SloLogoutresponse.new.create(settings, logout_request_id, nil, :RelayState => params[:RelayState])
136+
redirect_to logout_response
147137
end
148138

149139
end

app/views/layouts/application.html.erb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
<%= csrf_meta_tags %>
88
</head>
99
<body>
10-
11-
<%= yield %>
12-
10+
<%= yield %>
1311
</body>
1412
</html>

app/views/saml/complete.html.erb

Lines changed: 0 additions & 27 deletions
This file was deleted.

app/views/saml/index.html.erb

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,29 @@
1-
<p><%= link_to "Login", :action=>"sso"%></p>
1+
<% if session[:user_id].present? %>
2+
<p>Logged in.</p>
3+
4+
<% if @attrs.any? %>
5+
<p>You have the following attributes:</p>
6+
<table><thead><th>Name</th><th>Values</th></thead><tbody>
7+
8+
<% @attrs.each do |key,attr_value| %>
9+
10+
<tr><td><%= key %></td>
11+
<td>
12+
<% if attr_value.any? %>
13+
<ul>
14+
<% attr_value.each do |val| %>
15+
<li><%= val %></li>
16+
<% end %>
17+
</ul>
18+
<% end %>
19+
</td></tr>
20+
<% end %>
21+
</tbody>
22+
</table>
23+
<% end %>
24+
<p><%= link_to "Logout", :action => "logout" %></p>
25+
<p><%= link_to "Single Logout", :action => "logout", :slo => '1' %></p>
26+
27+
<% else %>
28+
<p><%= link_to "Login", :action=>"sso"%></p>
29+
<% end -%>

config/routes.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
Rails.application.routes.draw do
22

3-
get '/', to: 'saml#index'
4-
get '/saml', to: 'saml#sso'
5-
post '/saml/acs', to: 'saml#acs'
6-
get '/saml/metadata', to: 'saml#metadata'
7-
get '/saml/logout', to: 'saml#logout'
3+
resources :saml, only: :index do
4+
collection do
5+
get :sso
6+
post :acs
7+
get :metadata
8+
get :logout
9+
end
10+
end
11+
12+
root 'saml#index'
813

914
# The priority is based upon order of creation: first created -> highest priority.
1015
# See how all your routes lay out with "rake routes".

0 commit comments

Comments
 (0)