Play Framework: Как требовать входа в систему для некоторых действий, но не для всех - PullRequest
5 голосов
/ 01 декабря 2010

Добавление @With(Secure.class) к контроллеру блокирует весь неаутентифицированный доступ. Есть ли способ включить его только для определенных действий или исключить определенные действия после его включения на контроллере?

Ответы [ 5 ]

9 голосов
/ 02 декабря 2010

Вы не можете сделать это с защищенным модулем. Как сказал Нильс, защищенный модуль является скорее примером, чем решением. Вы можете создать свою собственную систему безопасности с аннотацией @Before. Вот пример:

public class Admin extends Controller {

@Before(unless={"login", "authenticate", "logout", "otherMethod"})
void checkAccess() {
    // check the cookie
}

public void login() {
    render();
}

public void authenticate(String email, String password) {
    // check the params and set a value in the cookie
}

public void logout() {
    // delete cookie
}

Рекомендую прочитать исходный код защищенного модуля.

4 голосов
/ 17 декабря 2010

С тех пор я нашел, что мое раннее решение @Public несколько ограничивало, поскольку оно не может адресовать унаследованные действия. Вместо этого я перешел к аннотации на уровне класса:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AllowGuest {

    String[] value();
}

и добавил этот код в начало метода Secure.checkAccess():

AllowGuest guest = getControllerInheritedAnnotation(AllowGuest.class);
if (guest != null) {
    for (String action : guest.value()) {
        if (action.equals(request.actionMethod))
            return;
    }
}

, который можно использовать так: @AllowGuest({"list","view"})

Это позволяет легко разрешить доступ к локальным и унаследованным действиям и видеть, какие действия в контроллере не защищены.

2 голосов
/ 25 сентября 2013

Удалите @With(Secure.class) аннотацию к контроллеру и добавьте этот кусок кода внутри контроллера.

@Before(unless={"show"})
static void checkAccess() throws Throwable {
    Secure.checkAccess();
}

где show - это действие, которое необходимо сделать общедоступным.

1 голос
/ 03 декабря 2010

Чтобы получить то, что я искал, я скопировал аннотацию Check и создал аннотацию Public.

package controllers;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Public {

}

, затем добавил эти две строки в начало Secure.checkAccess:

if (getActionAnnotation(Public.class) != null)
    return;

Теперь действия в контроллерах, использующих With(Secure.class), можно сделать доступными без входа в систему, добавив к ним аннотацию @Public.

0 голосов
/ 02 декабря 2010

Вы можете установить в @ Before-Tag защищенного контроллера значение, если только или только. Безопасный модуль - это скорее пример, чем решение.

...