Как интегрировать Spring Security и GWT? - PullRequest
17 голосов
/ 22 октября 2009

Я пытаюсь интегрировать Spring Security и GWT. Я также использую GWT-инкубатор безопасности. Я настроил все так, как было описано на их вики-страницах. Мне удалось заставить работать безопасность, используя intercept-url, но я не могу заставить его работать, используя аннотации. Есть идеи о том, в чем проблема?

P.S. Я использую Spring 2.5.6, Spring Security 2.0.5 и gwt-инкубатор-безопасность 1.0.1. Любые полезные ссылки и комментарии приветствуются.

Вот мои конфигурационные файлы

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<global-method-security secured-annotations="enabled"
    jsr250-annotations="disabled" />
<http auto-config="true">
    <!-- <intercept-url pattern="/**/*.rpc" access="ROLE_USER" /> -->
    <intercept-url pattern="/gwt/**" access="ROLE_USER" />
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
</http>
<authentication-provider>
    <user-service>
        <user name="rod" password="koala"
            authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" />
        <user name="dianne" password="emu" authorities="ROLE_USER,ROLE_TELLER" />
        <user name="scott" password="wombat" authorities="ROLE_USER" />
        <user name="peter" password="opal" authorities="ROLE_USER" />
    </user-service>
</authentication-provider>
<beans:bean id="greetService" class="com.ct.test.server.GreetingServiceImpl" />

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<!-- Default page to serve -->
<welcome-file-list>
    <welcome-file>Spring_test.html</welcome-file>
</welcome-file-list>
<!--  Spring related configuration  -->
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<!-- Initialise the Spring MVC DispatcherServlet -->
<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<!-- Map the DispatcherServlet to only intercept RPC requests -->
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/spring_test/greet.rpc</url-pattern>
    <!--
        <url-pattern>/org.example.gwtwisdom.GwtWisdom/services/*</url-pattern>
    -->
</servlet-mapping>
<servlet>
    <servlet-name>greetServlet</servlet-name>
    <servlet-class>com.ct.test.server.GreetingServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>greetServlet</servlet-name>
    <url-pattern>/spring_test/greet.rpc</url-pattern>
</servlet-mapping>
<!-- Spring security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

весна-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- The application context definition for the DispatcherServlet -->
<bean id="urlMapping" class="com.gwtincubator.security.server.GWTSecuredHandler">
    <property name="mappings">
        <map>
            <entry key="/spring_test/greet.rpc" value-ref="greetService" />
        </map>
    </property>
</bean>

Вот мой пример проекта, который я пытался интегрировать со Spring Security: http://www.filedropper.com/springtest_1

Ответы [ 7 ]

1 голос
/ 19 марта 2012

Я использую GWT + Spring security. Я нахожу в вашей конфигурации, есть некоторые недоразумения. На самом деле, существует очень простой способ, позволяющий весенней защите работать с вашим gwt независимо от gwt-инкубатора-безопасности . Вам просто нужно объявить контекст вашего приложения в вашем файле web.xml.

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext-security.xml</param-value>
  </context-param>

  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener> 

Вы не объявляете здесь свой диспетчер MVCServlet! Тогда все работает благодаря механизму инфраструктуры Spring Security.

Но этот способ настройки не объявляет DispatcherServlet, он прост, но в случае, если вам нужна некоторая функциональность безопасности, для которой нужен DispatcherServlet, это «пирог». Итак, как я встретил.

Тогда, если вы настаиваете на использовании gwt-инкубатора-безопасности. Я прочитал очень хорошее решение на французском, но не снимайте отметку. http://hugo.developpez.com/tutoriels/java/gwt/utilisation-gwt-avec-spring-et-hibernate/

  1. Интеграция Spring в приложение с GWT-SL: Фактически, для интеграции Spring и hibernate проблема состоит в том, как правильно настроить сервлет. Следует помнить, что Spring имеет свой собственный сервлет DispatcherServlet , так же как и gwt со своим «gwt servlet». Обычно в руководстве по GWT RPC сервлет gwt объявляется в web-xml , например
 <servlet>
    <servlet-name>appService</servlet-name>
    <servlet-class>com.google.gwt.app.example.server.AppServiceImpl</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>appService</servlet-name>
     <url-pattern>/app/appService</url-pattern>
   </servlet-mapping>

Если вам очень нравится Spring и вы хотите использовать DispatcherServlet для отправки запроса, то GWT-обработчик может помочь вам избавиться от проблемы. Во-первых, вы загружаете контекст приложения в web.xml , как показано ниже:

<context-param>
<param-name> contextConfigLocation </param-name>
    <param-value> classpath:applicationContext_GWT.xml </param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

Затем вы можете объявить вашу службу rpc в контексте Spring: applicationContext_GWT.xml

<bean id=" appService " 
         class=" com.google.gwt.app.example.server.AppServiceImpl">
</bean>

Но вы не должны забыть добавить объявление GWTHandler в файл контекста приложения applicationContext_GWT.xml
И последнее, что нужно объявить весенним сервлетом: DispatcherServlet в web.xml Обратите внимание на тот факт, что это правильный сервлет пружины, а не GWT-SL. web.xml

<servlet>  
    <servlet-name>handler</servlet-name>
    <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
       <load-on-startup>1</load-on-startup>
</servlet>  
<servlet-mapping>
<servlet-name>handler</servlet-name>
<url-pattern>*.rpc</url-pattern>
</servlet-mapping>

Имя сервлета важно, потому что DispatcherServlet будет искать контекстный файл пружины с именем «* -servlet.xml». Поскольку имя сервлета - обработчик, он будет искать контекст весны «handler-servlet.xml». Итак, здесь мы решим проблему следующим образом: мы помещаем контекст приложения, который не зависит от DispatcherServlet, в «applicationContext_GWT.xml», а затем тот, который зависит от DispatcherServlet в «-servlet.xml», в качестве сервлета. имя - «обработчик», тогда мы должны иметь «handler-servlet.xml», затем поместить следующую конфигурацию GWT_SL из applicationContext_GWT.xml в handler-servlet.xml Обработчик-servlet.xml

<bean id="urlProjectMapping" class="org.gwtwidgets.server.spring.GWTHandler">
        <!-- Supply here mappings between URLs and services. Services must implement the RemoteService interface but are not otherwise restricted.-->
        <property name="mappings">
             <map>
    <!-- Other mappings could follow -->
    <entry key="/app/appService.rpc" value-ref="appService" />
             </map>
         </property>
</bean> 

Затем добавьте следующую конфигурацию в web.xml dans la объявление de servlet.

<init-param>
               <param-name>contextConfigLocation</param-name>
    <param-value> /WEB-INF/handler-servlet.xml </param-value>
</init-param>

Шаблон фильтра касается только вызова RPC с суффиксом .rpc (Я не использовал GWT-SL, поэтому вышеописанный метод интеграции не был проверен.)

После того, как вы выполнили все вышеперечисленные настройки, вы создадите свою точку фильтра в контекстном файле приложения.

Надеюсь, это поможет вам!

0 голосов
/ 15 октября 2014

Вы можете использовать Putnami Web Toolkit (PWT) framework, здесь учебник по интеграции Spring Framework и еще один для Spring Security .

0 голосов
/ 27 февраля 2012

перейдите по следующей ссылке для настройки GWT с помощью Spring:

http://raibledesigns.com/rd/entry/integrating_gwt_with_spring_security

или

http://www.javacodegeeks.com/2010/12/securing-gwt-apps-with-spring-security.html

0 голосов
/ 21 декабря 2011

Я предполагаю, что вам нужно иметь схему в applicationContext.xml и включить аннотации:

<context:annotation-config />
<context:component-scan base-package="my.package" />

Ссылка: http://weblogs.java.net/blog/seemarich/archive/2007/11/annotation_base.html

0 голосов
/ 02 декабря 2011

Платформа Acris также использует Spring Security. У них есть описание этого в их вики http://code.google.com/p/acris/wiki/SecurityServer

0 голосов
/ 27 мая 2011
0 голосов
/ 04 марта 2010

Кажется, вам не хватает конфигурации пространства имен в вашем applicationContext.xml.

Это должно выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:sec="http://www.springframework.org/schema/security"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                           http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
...