从属性文件或xml文件中将属性值注入PreAuthorize(…)java注释(未解析)
作者:互联网
我在上一篇文章中已经问过这个问题: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" />
>我有两个模型类:用户和客户
public class User {
private int userId;
public int getUserId() {
return userId;
}
}
public class Customer {
private int customerId;
public int getCustomerId(){
return customerId;
}
}
>我有另一个服务/控制器类,我想限制
使用@PreAuthorize注释的“编辑”方法.
限制:允许该方法(授权执行)
当且仅当’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的问题,因为我厌倦了解决这个问题!!!所以请尽可能多地帮助我!
解决方法:
如果您正在使用属性文件并且想要在控制器类中访问它们,则必须添加< context:property-placeholder location =“classpath:my.properties”/>在您的servlet上下文xml文件中,之后您可以使用@Value批注来获取该属性的值.例如
my.properties文件包含some.userid = 33,因此您可以使用以下命令访问此属性:
@Value("${some.userid}")
private int someId;
但为了确保测试目的,我会将ignoreUnresolvablePlaceholders设置为false,如果它无法解析属性文件,我会知道错误来自哪里…
希望能帮助到你.
标签:java,spring,spring-security,spring-annotations,spring-el 来源: https://codeday.me/bug/20190624/1281580.html