aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-01-09 16:43:21 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-01-09 16:43:21 +0000
commitcbd367b7fa232be37781bba1063c38d5ac36e94b (patch)
treed1b776eca6c20348175f190dec2682054434e212
parent75fca04590a310bedc66a455d7508168ae932ba4 (diff)
downloadrails-cbd367b7fa232be37781bba1063c38d5ac36e94b.tar.gz
rails-cbd367b7fa232be37781bba1063c38d5ac36e94b.tar.bz2
rails-cbd367b7fa232be37781bba1063c38d5ac36e94b.zip
Added :before option to authentication
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@352 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--actionpack/CHANGELOG2
-rw-r--r--actionpack/lib/action_controller/authentication.rb5
-rw-r--r--actionpack/test/controller/authentication_test.rb17
3 files changed, 21 insertions, 3 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index 94f10207c4..4467f352bb 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -2,6 +2,8 @@
* Added authentication framework to protect actions behind a condition and redirect on failure. See ActionController::Authentication for more.
+* Added Base#render_nothing as a cleaner way of doing render_text "" when you're not interested in returning anything but an empty response.
+
* Added the possibility of passing nil to UrlHelper#link_to to use the link itself as the name
diff --git a/actionpack/lib/action_controller/authentication.rb b/actionpack/lib/action_controller/authentication.rb
index 3ba193c1b2..f4ccde20ca 100644
--- a/actionpack/lib/action_controller/authentication.rb
+++ b/actionpack/lib/action_controller/authentication.rb
@@ -34,9 +34,11 @@ module ActionController #:nodoc:
#
# Options are:
# * <tt>:by</tt> - the code fragment that will be evaluated on each request to determine whether the request is authenticated.
+ # * <tt>:before</tt> - a code fragment that's run before the failure redirect happens, such as
+ # '@session[:return_to] = @request.request_uri'.
# * <tt>:failure</tt> - redirection options following the format of Base#url_for.
def authentication(options)
- options.assert_valid_keys([:by, :failure])
+ options.assert_valid_keys([:by, :failure, :before])
class_eval <<-EOV
protected
def actions_excepted_from_authentication
@@ -71,6 +73,7 @@ module ActionController #:nodoc:
if !action_needs_authentication? || #{options[:by]}
return true
else
+ #{options[:before]}
redirect_to(#{options[:failure].inspect})
return false
end
diff --git a/actionpack/test/controller/authentication_test.rb b/actionpack/test/controller/authentication_test.rb
index abf0409d08..098d0596ff 100644
--- a/actionpack/test/controller/authentication_test.rb
+++ b/actionpack/test/controller/authentication_test.rb
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../abstract_unit'
class AuthenticationTest < Test::Unit::TestCase
class ApplicationController < ActionController::Base
- authentication :by => '@session[:authenticated]', :failure => { :controller => "login" }
+ authentication :by => '@session[:authenticated]', :before => '@session[:return_to] = "/weblog/"', :failure => { :controller => "login" }
end
class WeblogController < ApplicationController
@@ -10,7 +10,10 @@ class AuthenticationTest < Test::Unit::TestCase
def index() render_text "I indexed something" end
def edit() render_text "I edited something" end
def update() render_text "I updated something" end
- def login() @session[:authenticated] = true; render_nothing end
+ def login
+ @session[:authenticated] = true
+ @session[:return_to] ? redirect_to_path(@session[:return_to]) : render_nothing
+ end
end
class AuthenticatesWeblogController < WeblogController
@@ -86,4 +89,14 @@ class AuthenticationTest < Test::Unit::TestCase
get :edit
assert_success
end
+
+ def test_before_condition
+ @controller = AuthenticatesWeblogController.new
+
+ get :edit
+ assert_redirected_to :controller => "login"
+
+ get :login
+ assert_redirect_url "http://test.host/weblog/"
+ end
end \ No newline at end of file