我在上一篇文章中问过这个问题:SpEL for spring security: Passing Values from XML to Java based SpEL configuration。但它还没有解决。我想将值从xml配置或外部文件注入@PreAuthorize(...)
注释。使用@Value
注释进行注入并不容易。
要回忆这个问题,我提供以下信息。
我有以下xml配置文件(example.xml) 具有属性并初始化其相应的值。
<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>
我有以下外部属性文件 (example.properties)里面/ WEB-INF文件夹。这个文件是 上面提到的XML配置文件的替代方案。
user.id = 33
customer.id =33
我在applicationContext.xml文件中有属性策略持有者配置
<context:property-placeholder location="/WEB-INF/*.properties" ignore-unresolvable="true" />
<bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/example.properties" p:ignoreUnresolvablePlaceholders="true" />
我有两个模型类:User
和Customer
public class User {
private int userId;
public int getUserId() {
return userId;
}
}
public class Customer {
private int customerId;
public int getCustomerId(){
return customerId;
}
}
我有另一个我想限制的服务/控制器类
使用'edit'
注释的@PreAuthorize
方法。
The restriction
:允许该方法(授权执行)
当且仅当'userId'
和'customerId'
被评估为相等!
为了达到这个限制,我想考虑两种方式
将xml文件(example.xml)中的'userId'
和'customerId'
值注入下面的表达式1中。我用过的表达式
这是由Rob Winch建议的(谢谢Rob!)。但是,春天
无法评估表达方式。
将外部属性文件(example.properties)中的'userId'
和'customerId'
值注入表达式2
下面。同样,spring也无法评估这个表达式。
@Service("..") or @Controller
public class MyMainClass {
//Expression 1
@PreAuthorize("@userBean.userId == @customerBean.customerId")
public Boolean edit(User user, Customer custmer) {
return true;
}
//Expression 2
////I've tried other ways as well, but end up with similar exceptions
@PreAuthorize("${user.id} == ${customer.id}")
public Boolean edit(User user, Customer customer) {
return true;
}
}
我的问题:
Q1。我必须在@PreAuthorize
注释中放置什么才能将值从xml文件(example.xml)或属性文件(example.properties)注入@PreAuthorize(...)
表达式,然后才能容易评估?
Q2。如果我犯了表达以外的错误,请指出我。
Q3。这对我来说就像一个$ 1,000,000.00的问题,因为我厌倦了解决这个问题!!!所以请尽可能多地帮助我!。
答案 0 :(得分:4)
如果您正在使用属性文件并且想要在控制器类中访问它们,则必须在servlet上下文xml文件中添加<context:property-placeholder location="classpath:my.properties"/>
,之后您可以使用@Value批注来获取该属性的值。例如
my.properties
文件包含some.userid=33
,因此您可以使用以下方式访问此媒体资源:
@Value("${some.userid}")
private int someId;
但为了确保测试目的,我会将ignoreUnresolvablePlaceholders设置为false,如果它无法解析属性文件,我会知道错误的来源......
希望它有所帮助。