从属性文件或xml文件中将属性值注入PreAuthorize(...)java注释(未解析)

时间:2013-11-04 18:35:41

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

我在上一篇文章中问过这个问题:SpEL for spring security: Passing Values from XML to Java based SpEL configuration。但它还没有解决。我想将值从xml配置或外部文件注入@PreAuthorize(...)注释。使用@Value注释进行注入并不容易。

要回忆这个问题,我提供以下信息。

  1. 我有以下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>
    
  2. 我有以下外部属性文件 (example.properties)里面/ WEB-INF文件夹。这个文件是 上面提到的XML配置文件的替代方案。

    user.id = 33
    customer.id =33
    
  3. 我在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" />
    
  4. 我有两个模型类:UserCustomer

    public class User {
        private int userId;
    
    public int getUserId() {
            return userId;
        }
    }
    
    public class Customer {
        private int customerId;
    
        public int getCustomerId(){
            return customerId;
        }
    }
    
  5. 我有另一个我想限制的服务/控制器类 使用'edit'注释的@PreAuthorize方法。

    The restriction:允许该方法(授权执行) 当且仅当'userId''customerId'被评估为相等!

    为了达到这个限制,我想考虑两种方式

    1. 将xml文件(example.xml)中的'userId''customerId'值注入下面的表达式1中。我用过的表达式 这是由Rob Winch建议的(谢谢Rob!)。但是,春天 无法评估表达方式。

    2. 将外部属性文件(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;
          }
      }
      
  6. 我的问题:

    Q1。我必须在@PreAuthorize注释中放置什么才能将值从xml文件(example.xml)或属性文件(example.properties)注入@PreAuthorize(...)表达式,然后才能容易评估?

    Q2。如果我犯了表达以外的错误,请指出我。

    Q3。这对我来说就像一个$ 1,000,000.00的问题,因为我厌倦了解决这个问题!!!所以请尽可能多地帮助我!。

1 个答案:

答案 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,如果它无法解析属性文件,我会知道错误的来源......

希望它有所帮助。