如何整合Spring Security和GWT?

我正在尝试整合Spring Security和GWT。我还使用gwt-孵化器-安全性。我配置了他们wiki页面上描述的所有内容。我设法通过使用intercept-url来获得安全性,但是我无法使用注释使其工作。关于问题是什么的任何想法?

附言:我使用的是Spring 2.5.6,Spring Security 2.0.5和gwt-incubator-security 1.0.1。欢迎任何有用的链接和评论。

这是我的配置文件

应用上下文.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" />

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

弹簧服务.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


答案 1

我正在使用GWT + Spring安全性。我发现在你的配置中,有一些误解。事实上,有一种非常简单的方法可以让春季安全与您的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> 

您不会在这里声明您的 MVC 调度程序Servlet!然后,由于Spring Security框架机制,一切都可以正常工作。

但是这种配置方式并没有声明DispatcherServlet,它很简单,但是如果你需要一些需要DispatcherServlet的安全功能,那就是一个“piege”。所以正如我所遇见的。

然后,如果您坚持使用gwt-孵化器-安全性。我读过一个非常好的法语解决方案,但它没有被选中。http://hugo.developpez.com/tutoriels/java/gwt/utilisation-gwt-avec-spring-et-hibernate/

  1. 将Spring与GWT-SL集成在应用程序中:实际上,对于Spring和休眠的集成,问题是如何正确配置servlet。人们应该知道,Spring有自己的servlet“DispatcherServlet”,因此gwt及其“gwt servlet”。通常,在 GWT RPC 的教程中,gwt-servlet 是在 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>

然后,您可以在Spring上下文中声明您的rpc服务:applicationContext_GWT.xml

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

但是你不应该忘记在应用程序上下文文件中添加GWTHandler声明applicationContext_GWT.xml
最后一件事是在web中声明spring servlet:DispatcherServlet.xml。请注意,这是弹簧的正确服务,而不是GWT-SL。网.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>

Servlet 名称很重要,因为 DispatcherServlet 将搜索由 “*-servlet.xml” 命名的 spring 上下文文件。由于 servlet 名称是处理程序,它将搜索 spring 上下文“handler-servlet.xml”。所以在这里我们将像这样解决问题,我们将独立于DispatcherServlet的应用程序上下文放在“applicationContext_GWT.xml”中,然后将依赖于DispatcherServlet的应用程序上下文放在“-servlet.xml”中,因为servlet名称是“handler”,那么我们应该有“handler-servlet.xml”,然后将以下GWT_SL配置从applicationContext_GWT.xml放入hander-servlet.xml Handler-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 declaration de servlet。

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

筛选器模式仅涉及带有后缀 .rpc 的 RPC 调用(我没有使用 GWT-SL,因此尚未检查上述集成方法。

完成上述所有配置后,在 applicationi 上下文文件中创建 filtreprocessentrypoint。

希望这可以帮助你!


答案 2

您的应用程序Context中似乎缺少命名空间配置.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">