Как заставить работать перенаправление HTTPS в профиле WebSphere Application Server Liberty?

Я хочу, чтобы перенаправление HTTP работало в профиле WebSphere Application Server Liberty Profile (WLP). Например:-

Когда пользователь вводит: http://localhost:8080/helloworld, браузер должен автоматически переходить (перенаправляться) на https://localhost:9443/helloworld

Для этого я следовал этому документу, раздел 6.2, страница №. 136.

Ниже приведены образцы server.xml и web.xml:

сервер.xml

<server description="new server">

<!-- Enable features -->
<featureManager>
    <feature>jsp-2.2</feature>
    <feature>wab-1.0</feature>
    <feature>jaxrs-1.1</feature>
    <feature>blueprint-1.0</feature>
    <feature>localConnector-1.0</feature>
    <feature>ssl-1.0</feature>
    <feature>appSecurity-2.0</feature>
</featureManager>

<httpEndpoint host="localhost" httpPort="8081" httpsPort="9442" id="defaultHttpEndpoint">
</httpEndpoint>

<applicationMonitor updateTrigger="mbean"/>
<keyStore id="defaultKeyStore" password="{xor}Lz4sLCgwLTtu"/>

<application id="Hello.app" location="Hello.app.eba" name="Hello.app" type="eba"/>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>Hello</display-name>

    <security-constraint>
        <display-name>HTTPS Redirect Security Constraint</display-name>
        <web-resource-collection>
            <web-resource-name>Sample Web Service service</web-resource-name>
            <url-pattern>/Hello</url-pattern>
            <http-method>GET</http-method>

        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
</web-app>

Для краткости удалены теги <servlet> и <servlet-mapping>.

Ниже приведены версии, которые я использую: Java 7, WLP 8.5.5, Eclipse Juno, Google Chrome.

Любая помощь, рекомендации о том, почему перенаправление HTTPS не работает, будут высоко оценены.


person Anuroop    schedule 03.07.2013    source источник


Ответы (3)


Я подозреваю, что проблема в вашем ограничении безопасности. Глядя на это, я бы предложил изменить ваш URL-шаблон следующим образом:

/Привет мир

скорее, чем:

/Привет

Если вы хотите сопоставить несколько ресурсов, вы можете использовать подстановочные знаки, такие как:

  1. /* - соответствует всему
  2. /helloworld/* — соответствует всему, что содержит helloworld/ в URL-адресе.
  3. *.jsp — соответствует всем файлам с расширением jsp.
person Alasdair    schedule 06.07.2013
comment
Спасибо за помощь. Но настоящая проблема, похоже, заключалась в том, что я пропустил важный тег ‹auth-constraint›. Опубликую ответ после проверки моей теории. - person Anuroop; 08.07.2013
comment
@Anuroop Ваша теория, к сожалению, неверна, так как вам не нужно ограничение авторизации только для перенаправления https. Вам также не нужны шаги 1 и 2 из вашего решения или login-config. Поскольку логин вообще не требуется для перенаправления. - person Gas; 11.11.2014

Чтобы HTTPS Redirect работал на WLP, необходимо позаботиться о следующих моментах:

  1. Добавьте пользователей, роли и пароли в server.xml WLP.
  2. Привяжите приложение к роли безопасности.
  3. Добавьте функцию appSecurity-2.0 в server.xml WLP.
  4. Add following tags in web.xml
    1. <login-config>
    2. <security-constraint>
    3. <security-constraint><web-resource-name></security-constraint>
    4. <security-constraint><auth-constraint></security-constraint>
    5. <security-constraint><user-data-constraint></security-constraint>

Ниже приведены подробные шаги: -

<сильный>1. Добавьте пользователей, роли и пароли в server.xml WLP.

<basicRegistry id="MyRegistry">
    <user password="{xor}Mjo6MT4z" name="anuroop" />
    <group name="MyGroup">
        <member name="anuroop" />
    </group>
</basicRegistry>

<сильный>2. Привяжите приложение к роли безопасности.

<application id="Hello.app" location="Hello.app.eba" name="Hello.app" type="eba">
    <application-bnd>
        <security-role name="Manager">
        <group name="MyGroup" />
    </security-role>
    </application-bnd>
</application>

<сильный>3. Добавьте функцию appSecurity-2.0 в server.xml WLP.

<featureManager>
    <feature>appSecurity-2.0</feature>
</featureManager>

4.1, 4.2, 4.3, 4.4, 4.5

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>BasicRegistry</realm-name>
    <form-login-config>
        <form-login-page>/Login.jsp</form-login-page>
        <form-error-page>/LoginError.jsp</form-error-page>
    </form-login-config>
</login-config>

<security-constraint>

        <display-name>HTTPS Redirect Security Constraint</display-name>
        <web-resource-collection>
            <web-resource-name>Sample Web Service service</web-resource-name>
            <url-pattern>/Hello</url-pattern>
            <http-method>GET</http-method>
        </web-resource-collection>

    <auth-constraint>
        <role-name>Manager</role-name>
    </auth-constraint>

    <user-data-constraint>
    <description>Ensure to allow only confidential communication</description>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>

</security-constraint>
person Anuroop    schedule 08.07.2013
comment
Похоже на ошибку в WLP. Вам не нужен пользователь только для выполнения перенаправления. - person Archimedes Trajano; 10.05.2017
comment
Кроме того, в WebSphere Classic 9, когда это делается только с ограничением безопасности, также потребуется вход в систему, чтобы не разрешить анонимный доступ. Кажется, что самый безопасный способ поддержки анонимных перенаправлений веб-сферы — это фильтр, как отметил @Vince Thyng. - person Archimedes Trajano; 10.05.2017

Я решил это по-другому, но я думаю, что принятый ответ может быть лучше. Вы можете написать фильтр сервлета, а затем изменить файл web.xml, чтобы связать его с путем.

Код web.xml:

  <web-app id="WebApp">
      <filter>
        <filter-name>HTTPSFilter</filter-name>
        <filter-class>
        HTTPSFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HTTPSFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
 </web-app>

Код фильтра:

public class HTTPSFilter implements Filter {
    public void doFilter(ServletRequest req, 
                         ServletResponse res,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        // Forward to HTTPS if insecure HTTP was used
        if(!req.getScheme().startsWith("https")) {
            // Modify the Response object to be the SSL version of the URL
            String host         = request.getLocalName();

            String URI         = request.getRequestURI();
            if(URI == null) { URI = ""; }

            String queryString  = request.getQueryString();
            if(queryString == null) { queryString = ""; }

            response.sendRedirect("https://" + host + ":9443" + URI + ("".equalsIgnoreCase(queryString) ? "":"?") + queryString);
        }

        chain.doFilter(req, res);
    }
    public void init(FilterConfig config) throws ServletException {
    }
    public void destroy() {
    }
}
person Vince Thyng    schedule 11.11.2014
comment
Использование web.xml является правильным способом, так как он будет работать на любом сервере приложений. Вы делаете вручную то, что должен делать контейнер. Кроме того, вы жестко кодируете порт https, поэтому ваш фильтр не сработает, если кому-то понадобится изменить порт по умолчанию. - person Gas; 11.11.2014