Это возможно, но AFAIK невозможно без (некоторого) кода.Вот решение, которое никак не затрагивает развернутые веб-приложения , но также не дает никакой тонкой авторизации, только аутентификация.
Tomcat 7 (и 6?) Имеютизящная функция для выполнения аутентификации, даже если в веб-приложении нет защищенных ресурсов, называемых preemtiveAuthentication :
<Context preemptiveAuthentication="true">
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>
Вставьте это в ваш контекст, где бы он ни находился (возможно, вам нужно создать$CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml
для защиты mywebapp.war).
Это сделает любой входящий запрос с любым содержимым в заголовке авторизации для запуска авторизации.Любой запрос без заголовка авторизации будет по-прежнему проходить.
http://example.com:8080/mywebapp/
будет работать, в то время как GET / http://user:password@example.com: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>
И, вуаля, ваш контекст не допустит никаких запросов через , если только он не аутентифицирован в определенной вами области.