Подтвердить что ты не робот

Несколько login-config для Java webapp

У меня есть веб-приложение Java, в котором есть веб-сайт для взаимодействия с пользователем. Для аутентификации пользователей я настроил приложение через web.xml для использования проверки на основе FORM. Пользователи перенаправляются на страницу входа в систему, и до сих пор все в порядке.

Теперь мы разрабатываем настольный клиент (на С#) для этого веб-приложения, которое обращается к приложению через веб-службы RESTful. Я реализовал эти службы в том же веб-приложении, что и веб-сайт, и, конечно же, вызывающий веб-сервис также должен быть аутентифицирован. Но теперь я столкнулся с проблемой, что всякий раз, когда я вызываю веб-службу, сервер возвращает HTML-код входа в качестве ответа.

Я думаю, было бы здорово использовать другую конфигурацию login-config для моего сервлета службы REST (который, вероятно, затем использовал бы BASIC-аутентификацию).

Google многого не вырастил, но я не могу поверить, что я первый в такой ситуации. Поэтому я хотел бы услышать ваши мысли и решения.

Любой намек оценивается.

4b9b3361

Ответ 1

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

В противном случае используйте свою собственную аутентификацию.

Ответ 2

У меня была та же проблема, и я не мог найти решение. Вы можете определить несколько методов проверки подлинности: http://docs.oracle.com/cd/E24329_01/web.1211/e24485/thin_client.htm#SCPRG164 Но: К сожалению, как FORM, так и BASIC не могут существовать вместе в списке значений auth-method.

Ответ 3

Я решил эту проблему с клапаном tomcat. Клапан проверяет наличие заголовка авторизации, и в этом случае заголовок используется в качестве учетных данных для аутентификации пользователя, в противном случае имеет место обычный метод проверки подлинности.

Вот код клапана:

package org.tastefuljava.tomcat;

import java.io.IOException;
import java.security.Principal;
import javax.servlet.ServletException;
import org.apache.catalina.Realm;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;

public class AutoBasicValve extends ValveBase {
    private static final String BASIC_PREFIX = "basic ";

    private String encoding = "UTF-8";

    public String getEncoding() {
        return encoding;
    }

    public void setEncoding(String encoding) {
        this.encoding = encoding;
    }

    @Override
    public void invoke(Request request, Response response)
            throws IOException, ServletException {
        Principal principal = request.getUserPrincipal();
        Realm realm = getContainer().getRealm();
        if (principal != null) {
            if (containerLog.isDebugEnabled()) {
                containerLog.debug(
                        "Already authenticated as: " + principal.getName());
            }
        } else if (realm == null) {
            if (containerLog.isDebugEnabled()) {
                containerLog.debug("No realm configured");
            }
        } else {
            String auth = request.getHeader("authorization");
            if (auth != null) {
                if (auth.toLowerCase().startsWith(BASIC_PREFIX)) {
                    auth = auth.substring(BASIC_PREFIX.length());
                    byte[] bytes = Base64.decode(auth);
                    auth = new String(bytes, encoding);
                    int ix = auth.indexOf(':');
                    if (ix >= 0) {
                        String username = auth.substring(0, ix);
                        String password = auth.substring(ix+1);
                        principal = realm.authenticate(username, password);
                        if (principal == null) {
                            containerLog.warn(
                                    "Could not authenticate " + username);
                        } else {
                            containerLog.info(
                                    "Authenticated as " + principal.getName());
                            request.setAuthType("BASIC");
                            request.setUserPrincipal(principal);
                        }
                    }
                }
            }
        }
        getNext().invoke(request, response);
    }
}

Вы можете использовать клапан, добавив <Valve> тега либо в файле server.xml в вашей установке tomcat, либо в файле META-INF/context.xml вашего WebApp:

Проект находится на github: https://github.com/robbyn/mydsrealm

Ответ 4

К сожалению, login-config не отображается, как фильтры и сервлеты, поэтому для webapp есть только один глобальный. Это означает, что вам либо нужны 2 веб-приложения, либо если на JBoss вы можете использовать класс WebAuthentication, чтобы сообщить контейнер вашего приложения для программной логики. Однако, если вы используете встроенные причалы или другие веб-серверы, нет абсолютно никакого способа поддерживать BASIC и FORM вместе, используя web.xml. Вам нужно будет написать собственную службу проверки подлинности

Однако вы можете конвертировать в Apache Shiro и решить эти проблемы в удивительно хорошо написанном, простом дизайне. Эти шаги позволят клиентам REST использовать либо BASIC auth на каждой странице без cookie сеанса, либо войти в систему /rest/login и получить сеанс. Затем клиенты браузера могут использовать FORM auth

1) protect /login with "authc", set shiro.loginUrl to /login and host an HTML form at that location
2) protect /rest/login with "anon" and write a URL handler for POST with this code
    UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
    token.setRememberMe(rememberMe);
    SecurityUtils.getSubject().login(token);
3) protect /rest/logout with "logout"
4) protect /rest/** with "noSessionCreation, authcBasic, rest"

Ответ 5

Мне помогли https://wiki.apache.org/tomcat/SSLWithFORMFallback в сочетании с этим tomcat valve, чтобы разрешить сертификаты клиента SSL и форму и базовую резервную аутентификацию.

С наилучшими пожеланиями