Это возможно, но, насколько мне известно, это невозможно без (некоторого) кода. Вот решение, которое никоим образом не затрагивает развернутые веб-приложения, но которое также не дает вам детальной авторизации, только аутентификацию.
Tomcat 7 (и 6?) имеет отличную функцию для выполнения аутентификации, даже если в веб-приложении нет защищенных ресурсов, называемых preemtiveAuthentication:
<Context preemptiveAuthentication="true">
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>
Вставьте это в свой контекст, где бы он ни находился (возможно, вам нужно создать $CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml для защиты mywebapp.war).
Это приведет к тому, что любой входящий запрос с чем-либо в заголовке авторизации вызовет авторизацию. Любой запрос без заголовка Authorization все равно пройдет.
http://example.com:8080/mywebapp/ будет работать, а GET /
http://user:[email protected]:8080/mywebapp/ не будет (или проверит имя пользователя и пароль)
Таким образом, оставшаяся хитрость состоит в том, чтобы отключать эту "функцию" каждый раз даже для пользователей, которые не отправляют никаких заголовков авторизации. Здесь мне пришлось вернуться к Valve.
Вот код для клапана, который устанавливает заголовок запроса «Авторизация» на «foo», если он отсутствует.
import javax.servlet.ServletException;
import java.io.IOException;
import org.apache.catalina.valves.ValveBase;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
public class ConditionallyAddFakeAuthorizationHeader extends ValveBase {
public void invoke(Request request, Response response) throws IOException, ServletException {
if (request.getCoyoteRequest().getMimeHeaders().getValue("authorization") == null) {
request.getCoyoteRequest().getMimeHeaders().addValue("authorization").setString("foo");
}
getNext().invoke(request, response);
}
}
Скомпилируйте файл, задайте ему хороший пакет, если хотите, и поместите его в общий путь к классам Tomcat, а также добавьте изменения в файл mywebapp.xml следующим образом (добавьте новый клапан перед базовым аутентификатором!):
<Context preemptiveAuthentication="true">
<Valve className="ConditionallyAddFakeAuthorizationHeader"/>
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>
И вуаля, ваш контекст не пропустит ни один запрос, если только он не будет аутентифицирован в определенной вами области.
person
mogsie
schedule
29.05.2013