С тех пор я нашел, что мое раннее решение @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"})
Это позволяет легко разрешить доступ к локальным и унаследованным действиям и видеть, какие действия в контроллере не защищены.