SpEL для весенней безопасности: передача значений из XML в конфигурацию SpEL на основе Java

Я хочу передать значения свойств, назначенные в файле xml, выражению Spring (SpEL) в Java. Можете ли вы указать мне, как этого добиться? Чтобы было понятно, я привел следующий пример.

пример.xml-файла:

<beans>
    <bean id="user" class="x.y.User">
        <property name="name" value="A"/>
        <property name="userId" value="33"/>

    <bean id="customer" class="x.y.Customer">
        <property name="name" value="B"/>
        <property name="customerId" value="33"/>      
    </bean>   
</beans>

Имейте в виду, что у меня есть классы моделей «Пользователь» и «Клиент».

Я хочу защитить метод под названием «редактирование», используя аннотацию Pre-Authorize и выражения Spring следующим образом.

@PreAuthorize("(#user.userId == #customer.customerId)")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

Вопрос в том, как я могу передать значения userId и customerId из файла «example.xml» в приведенное выше выражение, чтобы сравнить два значения, а затем защитить метод «редактирования»?

Примечание. Я не хочу использовать оценщик разрешений. Пожалуйста, укажите мне, возможно ли это сделать без учета оценщика разрешений. Ваша поддержка и сотрудничество будут высоко оценены!.


person eyasu    schedule 28.10.2013    source источник


Ответы (3)


Вы можете обратиться к ссылки на компоненты в выражениях SpEL с использованием @.

Я немного изменил ваш пример, чтобы сделать его более очевидным, какая часть выражения SpEL относится к bean-компонентам, а какая часть относится к аргументам метода. Учитывая следующую конфигурацию:

<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>

Этот метод будет разрешен только в том случае, если аргумент User имеет значение userId из 33 (это значение свойства userBeans userId).

@PreAuthorize("#user.userId == @userBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

Точно так же вы можете сослаться на клиента с идентификатором customerBean (как определено в моем примере XML) следующим образом:

@PreAuthorize("#custmer.userId == @customerBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

Если вы хотите, чтобы он делал то же самое с вашей текущей конфигурацией XML, вы можете использовать следующее. Дело в том, что значение после @ должно соответствовать имени компонента.

@PreAuthorize("#user.userId == @user.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}
person Rob Winch    schedule 30.10.2013
comment
извините, что позволили ответить на ваш ответ, меня не было некоторое время. Большое спасибо за подробное объяснение и указание на выражение @ для ссылки на bean-компоненты. Это действительно хороший момент, я не видел раньше, чтобы ссылаться на bean-компоненты с помощью @. Это интересно, и я проверю это. Но я хочу прояснить одну вещь: метод «редактировать» разрешен, если идентификатор пользователя и идентификатор клиента равны, а не когда идентификатор пользователя равен 33. Я скоро опубликую результат. - person eyasu; 01.11.2013
comment
это не работает. Метод 'edit' разрешен, если userId userBean и customerId customerBean равны. По вашему предложению это должно быть написано следующим образом: @PreAuthorize(@userBean.userId == @customerBean.customerId) public Boolean edit(User user, Customer custmer) { return true; } Но он возвращает следующую ошибку: java.lang.IllegalArgumentException: Не удалось оценить выражение '(@userBean.userId == @customerBean.customerId)' - person eyasu; 04.11.2013
comment
Пожалуйста, укажите, когда именно вы хотите разрешить доступ, а когда нет. Ваш текущий пример не ясен, если вы хотите сослаться на аргументы метода или если вы хотите сослаться на bean-компоненты. - person Rob Winch; 05.11.2013
comment
Я хочу обратиться к bean-компонентам, теперь забудьте об аргументах метода. Просто подумайте о бобах. Я попытался еще раз уточнить это здесь: stackoverflow.com/questions/19774655/ Проверьте эту ссылку, она более понятна. Большое спасибо. - person eyasu; 05.11.2013

@Роб, это не работает. Метод 'edit' разрешен, если userId userBean и customerId customerBean равны. На основании вашего предложения это должно быть написано следующим образом:

@PreAuthorize("@userBean.userId == @customerBean.customerId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}   

Но он возвращает следующую ошибку:

java.lang.IllegalArgumentException: Failed to evaluate expression '(@userBean.userId == @customerBean.customerId)'

Любое предложение, пожалуйста?

ОБНОВЛЕНИЕ. Измените @userBean.userId на @user.userId и @customerBean.customerId на @customer.customerId.

person eyasu    schedule 04.11.2013
comment
@rdm Привет, rdm, «пользователь» и «клиент» не являются именами компонентов. Считаете ли вы, что '@user.userId' и '@customer.customerId' вводят значения из XML-файла? В любом случае, я собираюсь попробовать. Спасибо! - person eyasu; 05.11.2013

Почему вы объявляете пользователя и клиента как spring bean?

person rdm    schedule 01.11.2013
comment
Поскольку два класса, т. е. User и Customer, мои bean-компоненты Spring с переменными-членами (свойствами) userId и customerId соответственно. Короче говоря, у меня есть классы User.java и Customer.java. Вопрос заключается в том, как передать значения, инициализированные в файле xml, в приведенное выше выражение SpEL, чтобы защитить метод «редактирования». Я собираюсь попробовать предложение Роба и сообщить вам, ребята, о результате. Спасибо! - person eyasu; 01.11.2013
comment
Я попытался с предложением Роба, но в итоге получил исключение: java.lang.IllegalArgumentException: не удалось оценить выражение '(@userBean.userId == @customerBean.customerId)'. ваше предложение также приветствуется. Спасибо! - person eyasu; 04.11.2013
comment
Измените '@userBean.userId' на '@user.userId' и '@customerBean.customerId' на '@customer.customerId' - person rdm; 05.11.2013
comment
То же исключение: обработка запроса не удалась; вложенным исключением является java.lang.IllegalArgumentException: не удалось оценить выражение '(@user.userId == @customer.customerId)' - person eyasu; 05.11.2013