Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

SSL requirement adds a declarative way of specifying that certain act…

…ions should only be allowed to run under SSL, and if theyre accessed without it, they should be redirected.
  • Loading branch information...
commit 79ded847042aa9f8b4d619a70aa709cdf73b6704 0 parents
David Heinemeier Hansson dhh authored
Showing with 86 additions and 0 deletions.
  1. +36 −0 README
  2. +50 −0 lib/ssl_requirement.rb
36 README
@@ -0,0 +1,36 @@
+SSL Requirement
+===============
+
+SSL requirement adds a declarative way of specifying that certain actions should
+only be allowed to run under SSL, and if they're accessed without it, they should
+be redirected.
+
+The methods are: account_url, account_host, and account_domain.
+
+Example:
+
+ class ApplicationController < ActiveRecord::Base
+ include SslRequirement
+ end
+
+ class AccountController < ApplicationController
+ ssl_required :signup, :payment
+
+ def signup
+ # Non-SSL access will be redirected to SSL
+ end
+
+ def payment
+ # Non-SSL access will be redirected to SSL
+ end
+ end
+
+You can overwrite the protected method ssl_required? to rely on other things than
+just the declarative specification. Say, only premium accounts get SSL.
+
+P.S.: Beware when you include the SslRequirement module. At the time of inclusion,
+it'll add the before_filter that validates the declarations. Some times you'll want to
+run other before_filters before that. They should then be declared ahead of including
+this module.
+
+Copyright (c) 2005 David Heinemeier Hansson, released under the MIT license
50 lib/ssl_requirement.rb
@@ -0,0 +1,50 @@
+# Copyright (c) 2005 David Heinemeier Hansson
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+module SslRequirement
+ def self.included(controller)
+ controller.extend(ClassMethods)
+ controller.before_filter(:ensure_proper_protocol)
+ end
+
+ module ClassMethods
+ # Specifies that the named actions requires an SSL connection to be performed (which is enforced by ensure_proper_protocol).
+ def ssl_required(*actions)
+ write_inheritable_array(:ssl_required_actions, actions)
+ end
+ end
+
+ protected
+ # Returns true if the current action is supposed to run as SSL
+ def ssl_required?
+ (self.class.read_inheritable_attribute(:ssl_required_actions) || []).include?(action_name.to_sym)
+ end
+
+ private
+ def ensure_proper_protocol
+ if ssl_required? && !request.ssl?
+ redirect_to "https://" + request.host + request.request_uri
+ return false
+ elsif request.ssl? && !ssl_required?
+ redirect_to "http://" + request.host + request.request_uri
+ return false
+ end
+ end
+end
Please sign in to comment.
Something went wrong with that request. Please try again.