W tej chwili moja aplikacja ma model Pages. Każda osoba mająca adres URL /pages/3 może wyświetlić stronę. Chcę, aby marki miały opcję publiczną lub prywatną.

  • Jeśli są publiczne, każda osoba mająca adres URL może wyświetlać.

  • Jeśli strona jest prywatna, tylko użytkownicy, którzy wprowadzą hasło, powinni mieć możliwość jej przeglądania.

W tej chwili strona jest renderowana za pomocą kontrolera Page#Show. Jaki jest właściwy sposób radzenia sobie z tym, aby użytkownik, który próbuje uzyskać dostęp do prywatnej strony, musi najpierw poprawnie wprowadzić hasło, a następnie może wyświetlić stronę? Jak zorganizowałbym to w kontrolerze?

Dzięki

0
AnApprentice 16 sierpień 2011, 01:05

2 odpowiedzi

Najlepsza odpowiedź

Ponieważ używasz cancan:

def show
  @page = Page.find(params[:id])
  authorize! :read, @page
end

Spowoduje to zgłoszenie błędu CanCan::AccessDenied (jeśli użytkownik nie jest zalogowany lub nie jest autoryzowany), który może zostać przechwycony w ten sposób (dokumenty):

class ApplicationController < ActionController::Base
  rescue_from CanCan::AccessDenied do |exception|
    # Save the requested path in the user's session
    session[:return_to] = request.fullpath
    # Send the user to the sign in page
    redirect_to sign_in_path, :alert => exception.message
  end
end

W zależności od systemu uwierzytelniania, po pomyślnym zalogowaniu się w kontrolerze sesji możesz:

redirect_to session[:return_to] || your_default_after_sign_in_path
# Clear the :return_to value
session[:return_to] = nil

Może brakuje mi niektórych szczegółów, ale o to chodzi. Powodzenia.

EDYTUJ: Przyjazną część mojej odpowiedzi związanej z przekazywaniem powinienem przypisać Michaelowi Hartlowi i jego książka.

1
dwhalen 16 sierpień 2011, 03:11
1
Dzięki Danny, ale użytkownik zostanie zalogowany, nie trzeba się logować, więc nie jestem pewien, czy to rozwiązało problemy.
 – 
AnApprentice
16 sierpień 2011, 03:53

Wygląda na to, że potrzebujesz rozwiązania autoryzacyjnego. Polecam CanCan jest dość elastyczny. Prawdopodobnie możesz dostosować go, aby używał „Strony” jako zasobu, do którego się „logujesz”, zamiast standardowych „użytkowników”, jeśli nie masz jeszcze uwierzytelniania i/lub nie chcesz uwierzytelniania na użytkownika.

0
Msencenb 16 sierpień 2011, 01:23
Dzięki, obecnie używam CanCan, ale nie rozumiem, jak to rozwiązałoby użycie pełnoekranowego widoku hasła strony, jeśli strona jest prywatna?
 – 
AnApprentice
16 sierpień 2011, 01:25