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;
}
}
[이 질문에 유사] (http://stackoverflow.com/questions/6653495/configure-spring-security-on-embedded-jetty-in-spring?rq=1). – tdimmig