Arhn - архитектура программирования

Аутентификация со встроенным Jetty

Я пытаюсь добавить дайджест-аутентификацию в API, доступный через HTTP, используя встраивание Jetty. У меня нет web.xml, это не веб-приложение. Приложение запускается путем создания объекта ClassPathXmlApplicationContext из моего файла «spring-config.xml». В «spring-config.xml» я определяю множество bean-компонентов для сервисов и т. д., а также bean-компонент для запуска сервера Jetty.

Сервер Jetty настроен с помощью DispatcherServlet (на самом деле это класс DispatcherServletWrapper, который реализует ApplicationContextAware и устанавливает объект ClassPathXmlApplicationContext в качестве родителя создаваемого им GenericWebApplicationContext, таким образом, он может получить доступ к компонентам, определенным в моем файле spring-config.xml).

Это все работает, где он ломается, пытаясь добавить аутентификацию. Я добавляю все конфигурации spring-security для настройки дайджест-аутентификации, но я не знаю, как сообщить Jetty о цепочке фильтров.

Соответствующие разделы моего spring-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 не должен быть нулевым». Попробовать это и назвать его «springSecurityFilterChain» — это полные догадки, основанные на некоторых spring-docs и других вопросах, которые я читал.

Может ли кто-нибудь сказать мне, как получить эти конфигурации аутентификации, используемые Jetty? Имеет ли смысл то, что я пытаюсь сделать?

Для справки, мой DispatcherServletWrapper выглядит так:

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;
    }

}


Ответы:


1

Я успешно настроил встроенный Jetty + spring-security без web.xml

Вы можете программно добавить DelegatingFilterProxy и передать ему имя целевого компонента "springSecurityFilterChain"

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

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

Я также пытался использовать DigestAuthenticationFilter, но это не сработало.

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

02.03.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..