Получение значения из HttpServletRequest.getRemoteUser () в Tomcat без изменения приложения - PullRequest
7 голосов
/ 26 сентября 2011

(с использованием Java 6 и Tomcat 6.)

Есть ли способ получить HttpServletRequest.getRemoteUser() для возврата значения в моей среде разработки (например, localhost) без необходимости изменять файл web.xml моего приложения?

Причина, по которой я спрашиваю, заключается в том, что реализация аутентификации при развертывании приложения в удаленной среде обрабатывается веб-сервером и подключаемым инструментом. Работая локально, у меня явно нет подключенного инструмента или отдельного веб-сервера; У меня только Tomcat 6. Я пытаюсь избежать добавления кода в свое приложение просто для поддержки разработки на моем локальном хосте.

Я надеюсь, что есть изменение, которое я могу внести в файлы context.xml или server.xml, которые позволят мне установить идентификатор удаленного пользователя или попытаться извлечь его из заголовка HTTP или чего-то еще.

Ответы [ 2 ]

7 голосов
/ 27 сентября 2011

Вот подтверждение реализации концепции Valve, которая делает это:

import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.realm.GenericPrincipal;
import org.apache.catalina.valves.ValveBase;

public class RemoteUserValve extends ValveBase {

    public RemoteUserValve() {
    }

    @Override
    public void invoke(final Request request, final Response response)
            throws IOException, ServletException {
        final String username = "myUser";
        final String credentials = "credentials";
        final List<String> roles = new ArrayList<String>();

            // Tomcat 7 version
        final Principal principal = new GenericPrincipal(username, 
                            credentials, roles);
            // Tomcat 6 version:
            // final Principal principal = new GenericPrincipal(null, 
            //              username, credentials, roles);


        request.setUserPrincipal(principal);

        getNext().invoke(request, response);
    }

}

(протестировано с Tomcat 7.0.21.)

Скомпилируйте его, поместите в банку и скопируйте банку в папку apache-tomcat-7.0.21/lib. Вам необходимо изменить server.xml:

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true">

    <Valve className="remoteuservalve.RemoteUserValve" />
...

Полагаю, он работает и внутри контейнеров Engine и Context.

Дополнительная информация:

1 голос
/ 26 сентября 2011

Используйте локальную файловую область для тестирования. Проверьте свои conf/tomcat-users.xml и создайте роли и пользователей для своего приложения и включите ограничения безопасности в своем файле web.xml. Есть хорошие примеры в tomcat-users.xml.

...