如何使用SpEL访问@PostAuthorize中的模型内的对象

时间:2012-10-15 13:05:34

标签: spring spring-mvc spring-security spring-el spelevaluationexception

我创建此方法只是为了解释这个场景。我想评估模型对象中的用户域对象。

我知道我可以评估返回对象和方法参数。但是当我尝试使用模型对象时出现以下错误,**是否无法在PostAuthorize / PreAuthorize中使用模型对象? **

错误

[请求处理失败;嵌套异常是java.lang.IllegalArgumentException:无法根据原因计算表达式'#model.user.userName!='ramesh''] org.springframework.expression.spel.SpelEvaluationException:EL1008E:(pos 7):在'org.springframework.validation.support.BindingAwareModelMap'

类型的对象上找不到字段或属性'user'

@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";
}

2 个答案:

答案 0 :(得分:3)

您的模型对象没有名为“user”的属性,而是您正在访问它:model.put("user", user)。您的模型(ModelMap)似乎是某种类型的地图。

是否会延长java.util.Map
如果是这样,您可以使用如下拼写地图语法:#model[user].username

答案 1 :(得分:0)

两项工作:

@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";
}