Spring Security方法规则:返回值包含Collection

时间:2013-03-14 17:36:02

标签: java collections spring-security spring-el

在Spring Security中,我想确保一个包含返回值并使用@PostAuthorize的方法。

我想添加一个不允许一个用户访问他们不是所有者的资源的约束。我面临的问题是我想根据一个值集合检查主要ID。

情景:

域对象:

public class Car implements Serializable {
    private Integer id;
    private Collection<Driver> drivers;
    ...
}

public class Driver implements Serializable {
    private Integer id;
    ...
}

服务:

@PostAuthorize("hasRole('ROLE_ADMIN') or principal.id == returnObject.drivers.driver.id")
public Car getCar(int id) throws DAOException {
    ...        
    return carDAO.get(id);
}

当然,这个Spel表达式不起作用。

SEVERE: El Servlet.service() para el servlet [dispatcher] en el contexto con ruta [] lanzó la excepción [Request processing failed; nested exception is java.lang.IllegalArgumentException: Failed to evaluate expression 'hasRole('ROLE_ADMIN') or principal.id == returnObject.drivers.driver.id'] con causa raíz
org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 42): Field or property 'driver' cannot be found on object of type 'org.eclipse.persistence.indirection.IndirectList'

我还没有看到任何适用于Collection的示例。 This unsolved question类似但我不知道是否符合我的特定情况。 有可能做那样的事吗? 这是另一种做我想做的事情吗?

2 个答案:

答案 0 :(得分:3)

尝试按如下方式重写表达式:

@PostAuthorize("hasRole('ROLE_ADMIN') or returnObject.hasDriverWithId(principal.id)")

然后将相应的hasDriverWithId方法添加到您的Car类

答案 1 :(得分:0)

尝试访问列表中的属性driver并没有多大意义。你想要列表中的第一项吗?那么returnObject.drivers[0].id呢?