2012-08-24 27 views
11

Aktualnie czytam i pracuję nad przykładami podanymi w Getting Started with Grails, Second Edition by Scott Davis & Jason Rudolph.Zapobieganie ujawnianiu metody kontrolera Grails jako akcji

Ta książka została napisana przy użyciu Grails 1.2.

Mają przykładowy kod gdzie tworzą debug() metody, która jest wywoływana przez beforeInterceptor i wyjaśnił, że ponieważ debug() to metoda, nie jest narażony na zewnątrz do użytkownika za pośrednictwem adresu URL. Wyjaśniają, że Zamknięcia są ujawniane jako Działania kontrolujące dla Użytkownika końcowego, ale metody nie są.

Widziałem też na Grails 1.3 documentation one nawiązują do zwykłego sposobu:

def auth() { ... } 

traktowane jako prywatne, ponieważ jest to metoda, a nie zamknięcie. Tak jak w przypadku Grails 1.3.

Jednak, jak z Grails 2.0.0, Controller Actions can be implemented as both methods and closures.

Doprowadziło mnie to do zastanowienia (i spróbowania wymyślić) sposobu na odtworzenie funkcjonalności dostępnej w Pre-Grails 2.0.0 w celu stworzenia metody w kontrolerze, która nie zostanie ujawniona użytkownikowi końcowemu.

Pomyślałem o 2 możliwych podejściach i zastanawiałem się, który byłby lepszy styl/praktyka i dlaczego?

  1. Ustawianie accessor jako prywatne, to znaczy private def auth()
  2. Ustawianie allowedMethods dla metody na pusty ciąg:

    static allowedMethods = [save: "POST", update: "POST", delete: "POST", auth: ""] 
    

oba podejścia zdawała się osiągnąć pożądany efekt. Jednak pierwsze podejście daje kod błędu HTTP 404, a drugie podejście daje kod błędu HTTP 405.

Czy ktoś wie, które podejście byłoby lepsze? Czy są jakieś inne podejścia lub "technika najlepszych praktyk"?

Odpowiedz

13

W Grails 2.0 wszelkie metody oznaczone jako prywatne lub chronione nie są uważane za akcje.

Oznaczenie metody w ten sposób byłoby bardziej informatywne z powodów związanych z konserwacją, ponieważ jest widoczne na samym miejscu deklaracji metody, czy dana metoda może być użyta, zamiast zwracać uwagę na zmienną allowedMethods. Ponadto niedostępna metoda nie zostanie przypadkowo udostępniona, jeśli jej deklaracja zostanie usunięta lub nie zostanie dodana do allowedMethods.

4

Najlepiej oznaczyć ją jako prywatną, ponieważ 404 ukrywa, że ​​jest tam coś, co mogłoby zostać wykorzystane przez 405, aby wiedzieć, że istnieje funkcja o nazwie. (Nie jest to zbyt użyteczne.)

Również oznaczanie metody jako prywatnej jest miłe, ponieważ pokazuje, że metoda nie jest akcją.

+2

+1, metody, które nie powinny być narażone, nie powinny być "eksponowane", a nie "niedozwolone". – shihpeng

Powiązane problemy