Я пытаюсь реализовать общий класс контроллера, где каждый метод имеет структуру, подобную этой:
@RequestMapping(value="cadastra")
@PreAuthorize("hasPermission(#user, 'cadastra_#this.class.name')")
public ModelAndView cadastra() throws InstantiationException, IllegalAccessException {
return new ModelAndView("privado/"+this.entity.getClass().getName()+"/cadastra", "command", this.entity.getClass().newInstance());
}
У меня проблемы с аннотацией PreAuthorize
. имя разрешения имеет следующую структуру: _. прямо сейчас я получаю ошибку 403, когда пытаюсь получить доступ к представлению, отображаемому методом. Я также пробовал другие варианты, такие как:
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.class.name)")
or
@PreAuthorize("hasPermission(#user, 'cadastra_#this.getClass().getName()')")
но с тем же результатом. Кто-нибудь знает правильный способ сделать это?
ОБНОВЛЕНИЕ
Я пытаюсь вызвать эту функцию внутри методов из контроллера, защищенного этим тегом PreAuthorize:
private void expressionParser() {
System.out.println("expressionHandler()");
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("'cadastra_'+#this.class.name");
String message = (String) expression.getValue();
System.out.println("Message is " + message);
}
и когда я запускаю приложение и открываю представление, оно должно быть отображено методом из контроллера, например:
@RequestMapping(value="cadastra")
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.class.name)")
public ModelAndView cadastra() throws InstantiationException, IllegalAccessException {
this.expressionParser();
return new ModelAndView("privado/"+this.entityClass.getName()+"/cadastra", "command", this.entityClass.newInstance());
}
На консоли не отображается сообщение. Итак, я думаю, что мое приложение каким-то образом не вызывает методы из моего универсального контроллера. Я прав? Если да, то как мне это исправить?
Мои производные контроллеры следуют этой структуре:
@Controller
@RequestMapping(value="usuario")
public class UsuarioController extends controller<Usuario> {
public UsuarioController() {
super(Usuario.class);
}
}