У меня есть приложение Java, работающее на tomcat6.
Я использую Spring 3.0.4 и Spring Security 3.0.5.
для защиты доступа к моим методам дао, я хочу использовать пружинную защиту MethodSecurityInterceptor
. но этот на самом деле не «перехватывает» доступ вообще.
Он настроен так:
<bean id="securityInterceptor" class="org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor">
<property name="authenticationManager">
<ref bean="authenticationManager"/>
</property>
<property name="accessDecisionManager">
<ref bean="accessDecisionManager"/>
</property>
<property name="securityMetadataSource">
<value>
com.xkst.dao.InvoiceDao.*=ROLE_ADMIN
com.xkst.dao.UserDao.*=ROLE_ADMIN
</value>
</property>
</bean>
В соответствии с конфигурацией каждый доступ любого из методов UserDao должен быть перехвачен контролируемым.
Методы, которые должны быть защищены, доступны из Java-приложения с расширенными возможностями. Чтобы сделать услугу доступной для клиента, я использую пружину HttpInvokerServiceExporter
.
Дао классы не экспортируются напрямую. экспортируется один сервисный класс, предоставляющий клиенту единую точку доступа.
На стороне клиента у меня есть clientContext.xml
файл, который ссылается на экспортированную службу на сервере.
В коде клиента я просто загружаю контекст и выбираю из него экспортированный компонент
public class SecurityTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("clientContext.xml");
EntityServiceInterface serverService = (EntityServiceInterface) ctx.getBean("entityServiceInterface");
List<UserEntity> users = serverService.performGetAllUsers();
for(UserEntity user : users) {
System.out.println(user.getUserName());
}
}
здесь я могу просто вызвать любой метод 'serverService' на моем клиенте, который должен быть защищен с помощью MethodSecurityInterceptor без аутентификации. Я могу запросить все данные из моего 'UserDao'.
Я действительно не знаю, что такое недостающее звено.
authenticationManager
и accessDecisionManager
также настроены. при запуске сервера нет сообщения об ошибке. это даже регистрирует создание "безопасных методов" как:
2011-08-01 10:38:48,675 INFO MethodDefinitionMap:75 - Adding secure method [public java.util.List com.xkst.dao.UserDao.findAll()] with attributes [[ROLE_ADMIN]]
Так что я делаю не так?