Giocare quadro: come richiedere il login per alcune azioni, ma non tutti
-
29-09-2019 - |
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?
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.