用于Spring安全性的SpEL:将值从XML传递到基于Java的SpEL配置

时间:2013-10-28 00:32:59

标签: java xml spring spring-security spring-el

我想将xml文件中指定的属性值传递给Java中的Spring表达式(SpEL)。你能指出我如何实现这一目标吗?为清楚起见,我提供了以下示例。

example.xml文件:

<beans>
    <bean id="user" class="x.y.User">
        <property name="name" value="A"/>
        <property name="userId" value="33"/>

    <bean id="customer" class="x.y.Customer">
        <property name="name" value="B"/>
        <property name="customerId" value="33"/>      
    </bean>   
</beans>

请记住,我有'用户'和'客户'模型类。

我希望通过以下方式使用预授权注释和Spring表达式来保护名为'edit'的方法。

@PreAuthorize("(#user.userId == #customer.customerId)")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

问题是,我如何将“example.xml文件中的userId和customerId的值传递给上面的表达式来比较这两个值,然后保护'edit'方法?

注意:我不想使用权限评估程序。如果可以在不考虑许可评估者的情况下进行,请指出我。非常感谢您的支持与合作!

3 个答案:

答案 0 :(得分:1)

您可以使用@参考beans references in SpEL expressions

我稍微改变了你的例子,以使SpEL表达式的哪一部分引用bean更明显,哪部分引用方法参数。鉴于以下配置:

<beans>
    <bean id="userBean" class="x.y.User">
        <property name="name" value="A"/>
        <property name="userId" value="33"/>

    <bean id="customerBean" class="x.y.Customer">
        <property name="name" value="B"/>
        <property name="customerId" value="33"/>      
    </bean>   
</beans>

只有User参数的userId33时,才允许使用此方法(这是userBean s userId属性的值)

@PreAuthorize("#user.userId == @userBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

同样,您可以使用以下内容引用ID为customerBean的客户(在我的示例XML中定义):

@PreAuthorize("#custmer.userId == @customerBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

如果您希望它对您当前的XML配置执行相同的操作,您可以使用以下内容。这里的要点是@之后的值应该与bean的名称匹配。

@PreAuthorize("#user.userId == @user.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

答案 1 :(得分:1)

@Rob,它不起作用。如果userBean的userId和customerBean的customerId相等,则允许'edit'方法。根据您的建议,应该按照以下方式编写:

@PreAuthorize("@userBean.userId == @customerBean.customerId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}   

但它返回以下错误:

java.lang.IllegalArgumentException: Failed to evaluate expression '(@userBean.userId == @customerBean.customerId)'

有什么建议吗?

UPDATE。将@ userBean.userId更改为@ user.userId,将@ customerBean.customerId更改为@ customer.customerId

答案 2 :(得分:0)

为什么将User和Customer声明为spring bean?