Как вы реализуете базовую HTTP-аутентификацию Restlet на маршрутизаторе?

Я прочитал документацию Restlet о том, как реализовать базовую HTTP-аутентификацию, но моя не работает, когда я делаю запрос к ресурсу. По какой причине моя не работает?

Контекст приложения:

<!-- Used to map routes to Restlet resources -->
    <bean id="router" class="org.restlet.ext.spring.SpringRouter">
        <property name="attachments">
            <map>
                <!-- I removed the actual values because it references a company -->
                <entry key="/getCompanies" value="ClassResource" />
                <entry key="/getList" value="ClassResource" />
                <entry key="/getFile" value="ClassResource" />
                <entry key="/archiveFile" value="ClassResource" />
            </map>
        </property>
    </bean>

    <!-- Used to have login authentication for requests -->
    <bean id="challengeAuthenticator" class="org.restlet.security.ChallengeAuthenticator">
        <constructor-arg><null /></constructor-arg>
        <!-- Sets the Challenge scheme parameter to the static class member -->
        <constructor-arg value="#{ T(org.restlet.data.ChallengeScheme).HTTP_BASIC }" />
        <constructor-arg value="WSRealm" />
        <property name="next" ref="router" />
    </bean>

    <!-- Creates a restlet component that contains the server and attachs the application -->
    <bean id="restletComponent" class="org.restlet.ext.spring.SpringComponent">
        <!-- Sets the server in the Restlet component -->
        <property name="server" ref="server" />
        <!-- Attachs the application to the virtual host -->
        <property name="defaultTarget" ref="application" />
    </bean>

Я предполагал, что, поскольку я установил для маршрутизатора метод Challenge Authenticator next, когда я делаю запрос, он попадает в маршрутизатор и попадает в аутентификатор перед переходом к ресурсу.

Код Java:

ApplicationContext springContext = new GenericXmlApplicationContext("applicationContext.xml");
Component restletComponent = (Component) springContext.getBean("restletComponent");
GetFilesApplication application = (GetFilesApplication) springContext.getBean("application");
ChallengeAuthenticator challengeAuthenticator =
            (ChallengeAuthenticator) springContext.getBean("challengeAuthenticator");
Config config = application.getConfig();
MapVerifier mapVerifier = new MapVerifier();

// Puts the user name and password (encrypted) in the map verifier
mapVerifier.getLocalSecrets().put(config.getUsername(), StringCipher.encrypt(
            config.getPassword()).toCharArray());
challengeAuthenticator.setVerifier(mapVerifier);
restletComponent.getDefaultHost().attachDefault(challengeAuthenticator);

// Start the component
restletComponent.start();

Как я уже сказал ранее, единственное, что я вижу неправильным, это то, что я не уверен в установке следующего значения метода аутентификатора запроса для маршрутизатора.

Также для клиентской части добавлено:

clientResource.setChallengeResponse(ChallengeScheme.HTTP_BASIC, "correctUser", StringCipher.encrypt("password"));

Забыл упомянуть, что я тестирую это на своем локальном компьютере, клиент и веб-сервис.


person ColinMc    schedule 07.11.2012    source источник


Ответы (1)


Решил это. Потребовалось много времени, чтобы понять, но вот как я заставил это работать.

Код Java на стороне сервера:

// Removed and added to Application Context
restletComponent.getDefaultHost().attachDefault(challengeAuthenticator);

Контекст приложения:

<bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>configuration.properties</value>
                <value>log4j.properties</value>
            </list>
        </property>
    </bean>

    <bean id="config" class="Config class path location">
        <property name="filePath" value="${Properties entry value}"/>
        <property name="archivePath" value="${Properties entry value}"/>
        <property name="username" value="${Properties entry value}"/>
        <property name="password" value="${Properties entry value}"/>
    </bean>

    <!-- Restlet application -->
    <bean id="application" class="Application class path location" scope="singleton">
        <!-- Sets the router for the application -->
        <property name="root" ref="router" />
        <property name="config" ref="config" />
    </bean>

    <!-- Sets up the server -->
    <bean id="server" class="org.restlet.ext.spring.SpringServer">
        <constructor-arg value="${Properties entry value}" />
        <constructor-arg value="${Properties entry value}" />
    </bean>

    <!-- Used to map routes to Restlet resources -->
    <bean id="router" class="org.restlet.ext.spring.SpringRouter">
        <property name="attachments">
            <map>
                <entry key="/getCompanies" value="Resource class path location" />
                <entry key="/getList" value="Resource class path location" />
                <entry key="/getFile" value="Resource class path location" />
                <entry key="/archiveFile" value="Resource class path location" />
            </map>
        </property>
    </bean>

    <!-- Creates a restlet component that contains the server and attachs the application -->
    <bean id="restletComponent" class="org.restlet.ext.spring.SpringComponent">
        <!-- Sets the server in the Restlet component -->
        <property name="server" ref="server" />
        <!-- Attachs the application to the virtual host -->
        <property name="defaultTarget" ref="application" />
        <property name="defaultHost" ref="defaultHost" />
    </bean>

    <!-- Used to have login authentication for requests -->
    <bean id="challengeAuthenticator" class="org.restlet.security.ChallengeAuthenticator">
        <constructor-arg><null /></constructor-arg>
        <!-- Sets the Challenge scheme parameter to the static class member -->
        <constructor-arg value="#{ T(org.restlet.data.ChallengeScheme).HTTP_BASIC }" />
        <constructor-arg value="GetWSRealm" />
        <property name="next" ref="application" />
    </bean>

    <bean id="defaultHost" class="org.restlet.ext.spring.SpringHost">
        <constructor-arg ref="restletComponent" />
        <property name="defaultAttachment" ref="challengeAuthenticator" />
    </bean>

Надеюсь, это поможет другим попытаться заставить свое приложение работать. Мне потребовалось время, чтобы заставить это работать. :)

person ColinMc    schedule 08.11.2012