Как получить доступ к объектам внутри модели в @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";
}
Другие вопросы по тегам