Pregunta

Adición @With(Secure.class) a una bloques de regulación de todo acceso no autenticado. ¿Hay una manera de permitido sólo para ciertas acciones, o para exceptuar ciertas acciones después de que ha habilitado en un controlador?

¿Fue útil?

Solución

No se puede hacer eso con el módulo de seguridad. Como Niels dijo que el módulo seguro es más un ejemplo que una solución. Usted puede construir su propio sistema de seguridad con la anotación @Before. He aquí un ejemplo:

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
}

Le recomiendo que lea el código fuente del módulo seguro.

Otros consejos

he encontrado desde mi solución anterior @Public un tanto limitante ya que no puede hacer frente a las acciones heredadas. en cambio me he ido a una anotación de nivel de clase:

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

    String[] value();
}

y ha añadido este código al principio del método Secure.checkAccess():

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

que puede ser utilizado de esta manera: @AllowGuest({"list","view"})

Esto hace que sea fácil para permitir el acceso a las acciones locales y heredadas, y para ver qué acciones en un controlador no están garantizados.

Quitar @With(Secure.class) anotación al controlador y añadir esta pieza de código dentro del controlador.

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

donde show es la acción que debe poner a disposición del público.

Con el fin de conseguir lo que estaba buscando, que copió la anotación Check y creó una anotación 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 {

}

entonces añadió estas dos líneas para el comienzo de la Secure.checkAccess:

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

Ahora las acciones de los controladores utilizando With(Secure.class) pueden ser accesibles sin necesidad de acceder al añadir una anotación de @Public a ellos.

Se puede configurar en el @ Antes-Tag del seguro Controlador el valor a menos que o solamente. El Secure-módulo es más un ejemplo que una solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top