编程语言
首页 > 编程语言> > 从属性文件或xml文件中将属性值注入PreAuthorize(…)java注释(未解析)

从属性文件或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