Domanda

Aggiunta @With(Secure.class) a una blocchi di regolazione qualsiasi accesso non autenticato. C'è un modo per abilitato solo per determinate azioni, oa tranne alcune azioni dopo che è abilitata su un controller?

È stato utile?

Soluzione

Non si può farlo con il modulo sicuro. Come Niels ha detto che il modulo di sicuro è più un esempio di una soluzione. È possibile costruire il proprio sistema di sicurezza con l'annotazione @Before. Ecco un esempio:

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
}

Vi consiglio di leggere il codice sorgente del modulo di sicurezza.

Altri suggerimenti

Da allora ho trovato la mia soluzione @Public in precedenza un po 'limitante dal momento che non può affrontare azioni ereditate. Sono invece andato a un'annotazione a livello di classe:

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

    String[] value();
}

e ha aggiunto questo codice per l'inizio del metodo Secure.checkAccess():

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

che può essere utilizzato in questo modo: @AllowGuest({"list","view"})

Ciò rende più semplice per consentire l'accesso alle azioni locali e ereditate, e per vedere quali azioni in un controller non sono garantiti.

Rimuovi @With(Secure.class) annotazione al controller e aggiungere questo pezzo di codice all'interno del controller.

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

dove show è l'azione necessario per rendere accessibile al pubblico.

Al fine di ottenere ciò che cercavo, ho copiato l'annotazione Check e ha creato un'annotazione 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 {

}

Poi ho aggiunto queste due righe per l'inizio del Secure.checkAccess:

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

Ora le azioni nel controller utilizzando With(Secure.class) possono essere resi accessibili senza effettuare il login con l'aggiunta di un'annotazione @Public a loro.

È possibile impostare in @ Prima-Tag di Secure controller del valore a meno che o solo. Secure-Module è più un esempio di una soluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top