Question

Ajout @With(Secure.class) à un contrôleur bloque tout accès non authentifié. Est-il un moyen de permis que pour certaines actions, ou à l'exception de certaines actions après qu'il est activé sur un contrôleur?

Était-ce utile?

La solution

Vous ne pouvez pas le faire avec le module sécurisé. Comme Niels ledit module sécurisé est un exemple plus qu'une solution. Vous pouvez construire votre propre système de sécurité avec l'annotation @Before. Voici un exemple:

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
}

Je vous recommande de lire le code source du module sécurisé.

Autres conseils

Je l'ai depuis trouvé ma solution @Public plus tôt en limitant un peu, car il ne peut pas répondre à des actions héritées. Je suis allé à la place d'une annotation au niveau de la classe:

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

    String[] value();
}

et a ajouté ce code au début de la méthode Secure.checkAccess():

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

qui peut être utilisé comme ceci: @AllowGuest({"list","view"})

Cela rend plus facile pour permettre l'accès à des actions locales et héritées, et de voir quelles actions d'un contrôleur ne sont pas garantis.

annotation Supprimer le @With(Secure.class) au contrôleur et ajouter ce morceau de code à l'intérieur du contrôleur.

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

show est l'action que vous avez besoin de rendre publics.

Afin d'obtenir ce que je cherchais, j'ai copié l'annotation Check et a créé une annotation 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 {

}

alors j'ajouté ces deux lignes au début du Secure.checkAccess:

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

actions en utilisant les contrôleurs With(Secure.class) peuvent être accessibles sans vous connecter en ajoutant une annotation @Public pour eux.

Vous pouvez régler à l'@ Avant-Tag du contrôleur préservons la valeur à moins ou seulement. Le Secure-module est un exemple plus qu'une solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top