Как получить доступ к объектам внутри модели в @PostAuthorize, используя SpEL
Я создал этот метод только для объяснения сценария. Я хотел бы оценить объект домена пользователя внутри объекта модели.
Я знаю, что могу оценить возвращаемые объекты и аргументы метода. Но я получил следующую ошибку, когда попытался с объектом модели **, не возможно ли использовать объекты модели в PostAuthorize / PreAuthorize? **
ошибка
[Ошибка обработки запроса; вложенным исключением является java.lang.IllegalArgumentException: не удалось оценить выражение '#model.user.userName!= 'ramesh'] с первопричиной org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 7): поле или свойство 'user' не может быть найден в объекте типа 'org.springframework.validation.support.BindingAwareModelMap'
код
@PostAuthorize("#model.user.userName != 'ramesh'")
@RequestMapping(value="/createusername", method = RequestMethod.GET)
public String getCreateUserNamePage(ModelMap model) {
User user = new User();
String username = SecurityContextHolder.getContext().getAuthentication().getName();
if(username!=null)
user = customUserDetailsService.getUserByUsername(username);
else
user.setUserName(username);
model.put("user", user);
return "createusername";
}
1 ответ
У вашего объекта модели нет свойства, называемого "пользователь", вместо этого вы обращаетесь к нему так: model.put("user", user)
, Похоже, что ваша модель (ModelMap) является картой определенного типа.
Это распространяется java.util.Map
?
Если это так, вы можете использовать синтаксис карты spel следующим образом: #model[user].username
Оба работают:
@PostAuthorize("#model[user].userName != 'ramesh'")
or
@PostAuthorize("#model.asMap().get('user').getUserName() != 'ramesh'")
public String getSomething(Model model) {
User user = new User();
(...)
model.put("user", user);
return "view/page";
}