2013-04-22 4 views
2

Jetty를 사용하여 HTTP를 통해 사용할 수있는 API에 다이제스트 인증을 추가하려고합니다. 나는 web.xml이 없다. 이것은 webapp가 아니다. 응용 프로그램은 "spring-config.xml"파일에서 ClassPathXmlApplicationContext 객체를 생성하여 시작합니다. "spring-config.xml"에서 서비스 등을위한 많은 bean을 정의하고, 또한 Jetty 서버를 시작하기위한 bean을 정의한다.Jetty가 내장 된 인증

제티 서버는 ApplicationContextAware를 구현하고 생성 GenericWebApplicationContext의 부모로 ClassPathXmlApplicationContext 객체를 설정 실제로 DispatcherServletWrapper 클래스 DispatcherServlet에 (로 내 봄-config.xml 파일에 정의 된 콩에 액세스 할 수 있습니다 이런 식으로 구성되어 있습니다).

모든 것이 작동을 멈추는 곳은 인증을 추가하는 것입니다. 다이제스트 인증을 설정하기 위해 모든 스프링 보안 구성을 추가했지만 Jetty가 필터 체인을 인식하는 방법을 모르겠습니다. 이처럼 내 봄-config.xml의 모양의

관련 섹션 :

<bean id="restApiController" class="com.company.project.api.controllers.RESTfulController"> 
    <property name="broker" ref="broker"/> 
</bean> 

<mvc:annotation-driven/> 

<!--++++++++++++++++++++++ 
    JETTY BEANS 
+++++++++++++++++++++++--> 

<security:authentication-manager alias="authenticationManager"> 
<security:authentication-provider> 
    <security:user-service id="userService"> 
     <security:user name="apiUser" password="apiPassword" authorities="ROLE_USER"/> 
    </security:user-service> 
</security:authentication-provider> 
</security:authentication-manager> 

<bean id="digestEntryPoint" class="org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint"> 
<property name="realmName" value="Digest Auth Realm"/> 
<property name="key" value="acegi"/> 
</bean> 

<bean id="digestFilter" class="org.springframework.security.web.authentication.www.DigestAuthenticationFilter"> 
<property name="userDetailsService" ref="userService"/> 
<property name="authenticationEntryPoint" ref="digestEntryPoint"/> 
</bean> 

<security:http create-session="stateless" use-expressions="true" entry-point-ref="digestEntryPoint"> 
<security:intercept-url pattern="/**" access="ROLE_USER"/> 
<security:custom-filter ref="digestFilter" position="FIRST"/> 
</security:http> 

<bean id="JettyServer" class="org.eclipse.jetty.server.Server" init-method="start" destroy-method="stop"> 

<constructor-arg> 
     <bean id="threadPool" class="org.eclipse.jetty.util.thread.QueuedThreadPool"> 
      <property name="minThreads" value="2"/> 
      <property name="maxThreads" value="10"/> 
     </bean> 
</constructor-arg> 

<property name="connectors"> 
    <list> 
     <bean id="Connector" class="org.eclipse.jetty.server.ServerConnector"> 
      <constructor-arg ref="JettyServer"/> 
      <property name="port" value="8090"/> 
     </bean> 
    </list> 
</property> 

<property name="handler"> 
    <bean id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> 
     <property name="handlers"> 
      <list> 
       <bean id="servletContextHandler" class="org.eclipse.jetty.servlet.ServletContextHandler"> 
        <property name="contextPath" value="/"/> 
        <property name="servletHandler"> 
         <bean class="org.eclipse.jetty.servlet.ServletHandler"> 
          <property name="filters"> 
           <list> 
            <bean class="org.eclipse.jetty.servlet.FilterHolder"> 
             <property name="name" value="springSecurityFilterChain"/> 
             <property name="filter"> 
              <bean class="org.springframework.web.filter.DelegatingFilterProxy"/> 
             </property> 
             <!--<property name="filter" ref="digestFilter"/>--> 
            </bean> 
           </list> 
          </property> 
          <property name="filterMappings"> 
           <list> 
            <bean class="org.eclipse.jetty.servlet.FilterMapping"> 
             <property name="filterName" value="springSecurityFilterChain"/> 
             <property name="pathSpec"><value>/*</value></property> 
            </bean> 
           </list> 
          </property> 
          <property name="servlets"> 
           <list> 
            <bean class="org.eclipse.jetty.servlet.ServletHolder"> 
             <property name="name" value="DefaultServlet"/> 
             <property name="servlet"> 
              <!--<bean class="org.springframework.web.servlet.DispatcherServlet"/>--> 
              <bean class="com.impulse.sessiontracker.api.DispatcherServletWrapper"/> 
             </property> 
             <!-- 
             <property name="initParameters"> 
              <map> 
               <entry key="contextConfigLocation" value="classpath:./spring-security.xml" /> 
              </map> 
             </property> 
             --> 
            </bean> 
           </list> 
          </property> 
          <property name="servletMappings"> 
           <list> 
            <bean class="org.eclipse.jetty.servlet.ServletMapping"> 
             <property name="pathSpecs"> 
              <list><value>/</value></list> 
             </property> 
             <property name="servletName" value="DefaultServlet"/> 
            </bean> 
           </list> 
          </property> 
         </bean> 
        </property> 
       </bean> 
       <bean class="org.eclipse.jetty.server.handler.RequestLogHandler"> 
        <property name="requestLog"> 
         <bean class="org.eclipse.jetty.server.NCSARequestLog"> 
          <constructor-arg value="/opt/impulse/logs/jetty-yyyy_mm_dd.log"/> 
          <property name="extended" value="false" /> 
         </bean> 
        </property> 
       </bean> 
      </list> 
     </property> 
    </bean> 
</property> 

</bean> 

나는 일이 아무것도의 원인이하지 않는 것 부두의 필터 목록에서 직접 DigestAuthenticationFilter를 참조 시도했습니다. 그리고 위의 메소드를 사용해 보았습니다. DelegatingFilterProxy를 참조하려고합니다.이 경우 "ServletContext가 null이 아니어야합니다."예외가 발생합니다. 그것을 시도하고 그것을 "springSecurityFilterChain"으로 명명하는 것은 스프링 - 워드 프로세서와 내가 읽은 다른 질문들에 기초한 완전한 추측이다.

아무도 제티가 사용하는 이러한 인증 구성을 얻는 방법을 말해 줄 수 있습니까? 내가 뭘하려고하는지 이해가 되니? 참고로

, 내 DispatcherServletWrapper은 다음과 같습니다

나는 성공적으로 web.xml을하지 않고 내장 부두 + 봄 보안을 구성한
public class DispatcherServletWrapper extends DispatcherServlet implements ApplicationContextAware { 

    private static final long serialVersionUID = -2281511575328213502L; 
    private ApplicationContext appContext; 

    @Override 
    public void setApplicationContext(ApplicationContext arg0) 
      throws BeansException { 
     this.appContext = arg0; 
    } 

    protected WebApplicationContext createWebApplicationContext(WebApplicationContext arg0) { 
     GenericWebApplicationContext wac = new GenericWebApplicationContext(); 
     wac.setParent(appContext); 
     wac.refresh(); 

     return wac; 
    } 

} 
+0

[이 질문에 유사] (http://stackoverflow.com/questions/6653495/configure-spring-security-on-embedded-jetty-in-spring?rq=1). – tdimmig

답변

2

당신은 프로그래밍 방식 DelegatingFilterProxy를 추가하고 그것에게 대상을 전달할 수 있습니다 나는 또한 시도 콩 이름 "springSecurityFilterChain"

//Spring Security servlet 
final FilterHolder springSecurityFilterChain = new FilterHolder(
    new DelegatingFilterProxy("springSecurityFilterChain")); 

jettyServletContext.addFilterWithMapping(springSecurityFilterChain, "/*", 
           EnumSet.of(DispatcherType.REQUEST)); 

DigestAuthenticationFilter를 사용하지만 작동하지 않습니다.

희망이 도움이 될 수 있습니다.

관련 문제