2012-06-11 8 views
5

Ich habe eine ganze Nuss Kombination hier zu knacken .. Versucht unsere Webapp zu integrieren, sagte 3 Technologien in .. WirDispatcherServlet, Context und SpringSecurity

  1. Spring Web
  2. Spring MVC als Ansicht verwenden möchten Technologie (mit Freemarker)
  3. Spring Security als Sicherheitsschicht

Aber je nachdem, welche Art und Weise ich meine web.xml und andere Kontext-Dateien konfigurieren erhalte ich kann nicht alles zur gleichen Zeit arbeiten .. Mit meiner aktuellen Konfiguration alles funktionieren wird, außer SpringSecurity wird die URL-Muster

Einige googeln (und commons Sinn) hat mir gesagt, nicht abfangen, dass DispatcherServlet und Context Kombination könnte ein Problem sein.

Also hier sind meine Konfigurationen. (Es tut uns so viel Text und vielen Dank für das Lesen):

web.xml:

<!-- Needed by Spring --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/dw-manager-context.xml</param-value> 
</context-param> 

<!-- Needed by Spring MVC --> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<!-- Needed by 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> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

Mein Servlet-context.xml:

<!-- Scan for controllers --> 
<context:component-scan base-package="dw.manager" /> 

<!-- Need to declare annotation driven transactions again so they are picked up above controller methods --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

<mvc:annotation-driven /> 

<bean id="viewResolver"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    <!-- ... --> 
</bean> 

<bean id="freemarkerConfig" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <!-- ... --> 
</bean> 

Mein Manager-context.xml:

<context:annotation-config /> 

    <!-- deployment-setup just loads properties (files) --> 
<import resource="deployment-setup.xml" /> 
<import resource="spring-security-context.xml" /> 
<import resource="dw-manager-datasource.xml" /> 

<!-- Import sub-modules --> 
<import resource="classpath:dw-security-context.xml" /> 
<!-- ... --> 

Frühlings-Sicherheit-context.xml:

<http pattern="/login" security="none" /> 
<http pattern="/accessDenied" security="none" /> 
<http pattern="/" security="none" /> 

<!-- enable use of expressions, define URL patterns and login/logout forms 
    and targets) --> 
<http use-expressions="true" access-denied-page="/accessDenied"> 
    <intercept-url pattern="/*" access="hasRole('ROLE_USER')" /> 
    <!-- more stuff --> 
</http> 

<!-- a lot more... --> 

Manager-Datenquelle setzt einfach die Datenbank ...


Dankten für alles und hoffentlich liest mir helfen ..;)


edit: ein paar mehr Infos

Ich kann nicht einfach den ContextLoaderListener überspringen, es wird von SpringSecurity benötigt. Ich kann ContextConfigLocation auch nicht überspringen, da dies der Kontext ist, der von ContextLoaderListener benötigt wird. Ich definiere nur den Namen selbst, sonst wird nach einer applicationContext.xml gesucht. Vielleicht kann ich ein leeres contextConfigLocation hinzufügen? Aber das bedeutet wahrscheinlich nur, dass die zugrunde liegenden Module ihre Bohnen nicht zum injizieren finden ..?


edit2

denke ich, das Hauptproblem ist, dass SpringSecurity ein Webapp Kontext (Context) arbeiten muss, aber die Web-Anwendung innerhalb des Servlet-Kontext ausgeführt wird. Die Controller-Methoden werden durch den Servlet-Kontext zugeordnet und somit wird die außerhalb des Servlet-Kontextes laufende Sicherheitsfunktion nicht vom Ereignis benachrichtigt und der Filter tritt nicht ein.

+0

Können Sie mir sagen, was passiert, wenn Sie eine Anfrage ilike '/ test' geben, wird es an das Gehen Controller oder auf die Anmeldeseite umgeleitet werden? –

+0

'2012-06-11 15:31:23 PageNotFound [WARN] Keine Zuordnung gefunden für HTTP-Anfrage mit URI [/ dw-manager/test] in DispatcherServlet mit dem Namen 'appServlet'' – Pete

+0

Wenn Sie eine gültige URL geben, was ist das? Antwort zurückgegeben? –

Antwort

0

Seufz .. Ich weiß es nicht Warum es beim ersten Mal nicht funktionierte, war wahrscheinlich die falsche Lösung im Cache, während ich das richtige versuchte. Aber es funktioniert jetzt genau so, wie ich es gepostet habe. Danke Arun für deine Zeit.

Einziges Problem jetzt: spring-Test-mvc nicht Spring Security des filter unterstützen, aber das ist eine andere Frage ..