4

以前の投稿でこの質問をしました: 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. /WEB-INF フォルダー内に次の外部プロパティ ファイル (example.properties) があります。このファイルは、前述の 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. 2 つのモデル クラスがUserあります。Customer

    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'が等しいと評価される場合にのみ許可されます (実行が許可されます)。

    制限を達成するために、2つの方法を検討したい

    1. 以下の式 1 にxmlファイル (example.xml) の値'userId'と値を挿入します。'customerId'この中で私が使用した表現は、Rob Winch (ありがとう、Rob!) によって提案されました。ただし、Spring は式を評価できませんでした。

    2. 外部プロパティ ファイル (example.properties) の値を以下の式 2 に挿入します'userId''customerId'同様に、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. @PreAuthorizexml ファイル (example.xml) またはプロパティ ファイル (example.properties) から値を式に挿入するために注釈内に配置する必要がある正しい式は何@PreAuthorize(...)ですか?簡単に評価できますか?

Q2. 表現以外の間違いがあれば指摘してください。

Q3. この問題を解決するのにうんざりしているので、私にとっては1,000,000.00ドルの質問のようなものです!!!. だから、できる限り私を助けてください!

4

1 に答える 1