2013-10-28 35 views
1

我想将xml文件中分配的属性值传递给Java中的Spring表达式(SpEL)。你能指出我如何实现这一目标吗?为了说清楚,我提供了下面的例子。Spring安全性的SpEL:将值从XML传递到基于Java的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> 

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

我想要通过使用Pre-Authorize注释和Spring表达式以下面的方式来保护名为'edit'的方法。

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

的问题是,我怎么可以通过帐户及客户ID值从“文件的example.xml对上述表达两个值进行比较,然后确保‘编辑’的方法?

注:我不想使用许可评估,请点我,如果有可能做到这一点,而不考虑允许评估您的支持与合作,将大幅升值!

回答

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参数具有的33userId(这是userBean小号userId属性的值)这个方法将只被允许。

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

同样,你可以参考与customerBean ID的客户(在我的示例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

对于让我回复您的答案感到抱歉,我不在一段时间。非常感谢详细的解释和指出@表达式来引用bean。这真是一个好点,我在使用@引用bean之前没有看到。它很有趣,我会检查它。但我想澄清一件事,如果用户标识和客户标识相同,则不允许使用“编辑”方法,而不是当用户标识为33时。我将很快发布结果。 – eyasu

+1

它不起作用。如果userBean的userId和customerBean的customerId相等,则允许'edit'方法。根据您的建议,应该按照以下方式编写:@PreAuthorize(“@ userBean.userId == @ customerBean.customerId”) 公共布尔编辑(用户用户,客户定制者){ return true; }但它返回以下错误:java.lang.IllegalArgumentException:无法评估表达式'(@ userBean.userId == @ customerBean.customerId)' – eyasu

+0

请指定何时准确地允许访问,何时不允许访问。你现在的例子并不清楚你是否想要引用方法参数,或者如果你想引用bean。 –

0

为什么要将用户和客户声明为spring bean?

+1

因为这两个类,即User和Customer,我的spring bean分别具有userId和customerId成员变量(属性)。总之,我有User.java和Customer.java类。问题是如何将xml文件中初始化的值传递给上面的SpEL表达式以保证'编辑'方法的安全。我会尝试Rob的建议,并让你知道结果的人。谢谢! – eyasu

+0

我尝试了Rob的建议,但最终出现异常:java.lang.IllegalArgumentException:未能评估表达式'(@ userBean.userId == @ customerBean.customerId)'。你的建议也表示赞赏。 TNX! – eyasu

+0

将'@ userBean.userId'更改为'@ user.userId'和'@ customerBean.customerId'至'@ customer.customerId' – rdm

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

+1

@rdm您好rdm,'user'和'customer'不是bean名称。你认为'@ user.userId'和'@ customer.customerId'是否从xml文件注入值?无论如何,我要去尝试一下。谢谢! – eyasu