При использовании JASPIC для аутентификации все еще актуален ли web.xml с точки зрения аутентификации?

Прошло много времени с тех пор, как я выполнил работу JASPIC.

у меня есть web.xml это выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>service-broker-related-resources</web-resource-name>
      <url-pattern>/v2/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>emcc</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Frob Service Broker</realm-name>
  </login-config>

  <security-role>
    <role-name>emcc</role-name>
  </security-role>

</web-app>

У меня также установлен и установлен модуль проверки подлинности сервера (SAM). Это упоминается в моем glassfish-web.xml как это:

<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app httpservlet-security-provider="emccSAM">

У меня SAM работает нормально.

На самом деле, это работает слишком хорошо! Он перехватывает все запросы, а не только те, которые определены <url-pattern> из /v2/*, Это изначально удивило меня.

Но потом, когда я много думаю об этом, я думаю, что это имеет определенный смысл: SAM теперь отвечает за аутентификацию, а не за контейнер, на самом деле.

Так это web.xml сейчас по сути неактуально?

Затем я подумываю еще об этом и ясно, что это актуально, потому что в его содержании также говорится, что делать после аутентификации, т.е. если пользователь прошел аутентификацию через SAM, теперь проверьте, есть ли у него emcc роль. Если она этого не делает, и, по-видимому, запрос начинается с /v2/тогда мы ее загрузим. Если она этого не делает, и, предположительно, запрос начинается с чего-то еще, то мы впускаем ее.

Так значит ли это ожидаемое поведение, что мой SAM должен самостоятельно все решить, заслуживает ли входящий запрос аутентификации? Я ожидаю, что мой SAM будет срабатывать "нормально", то есть только когда кто-то пытается получить доступ к URI, который требует аутентификации, как описано <security-constraint>,

Возможно, стоит отметить, что единственный сервлет в игре - это тот, который установлен по умолчанию, когда JAX-RS Application класс аннотируется @ApplicationPath("/v2"),

1 ответ

Решение

SAM действительно полностью отвечает за аутентификацию. Это может уважать декларативную конфигурацию, но не обязательно. Он может даже полностью выполнить авторизацию запросов Servlet (хотя это будет выходить далеко за рамки его контракта).

Согласно п. 3.8.3 спецификации JA SPIC, validateRequest вызываться на настроенном ServerAuthContext (следовательно, в этом случае и его единственная инкапсулированная SAM) "при каждом запросе, который удовлетворяет соответствующим требованиям к соединению".

Если SAM хочет знать, должна ли конечная точка сервлета с точки зрения дескриптора или аннотации считаться "защищенной", она может вызвать isMandatory на requestMessagePolicy аргумент, переданный ему во время инициализации, или зондирование во время аутентификации сообщения, MessageInfo Карта аргумента для присутствия "javax.security.auth.message.MessagePolicy.isMandatory" ключ и сопоставленное значение, равное Boolean.valueOf(value).booleanValue() == true (спецификация § 3.8.1.1).

И последнее, но не менее важное: декларативные ограничения безопасности не имеют значения с точки зрения авторизации? Прежде всего, я не уверен, что различные спецификации подходят для SAM, назначающего незадекларированные роли. Помимо этого, я никогда не пробовал этого, так что я могу только догадываться и давать неопределенный ответ на данный момент. Я предполагаю, что это будет более или менее так же, как в случае провайдера аутентификации. По сути, вы берете на себя ответственность за настройку провайдера за пределами A S, следовательно, вы должны как-то компенсировать, то есть предоставлять альтернативные интерфейсы конфигурации. Скажем, авторизация управляется неким JACC-провайдером. Если это значение по умолчанию, предоставляемое A S, при отсутствии декларативных ограничений безопасности он не сможет признать тот факт, что вызывающий должен быть в "emcc" роль для того, чтобы получить доступ к /v2/* коллекция ресурсов, т. е. иметь эквивалент WebRoleRefPermission сопоставлены с их Principal; Таким образом, Policy::implies всегда будет предоставлять доступ. Но провайдер, созданный вручную, например, SAM, может получить эти знания из других источников, так что @RolesAllowed и друзья, делегирующие это, все еще работают. В конце концов, это не так, как если бы модель безопасности Java EE включала "заселение" населенных пунктов. Subjects, привязывая их к запросам AccessControlContextс, обработка Subject::doAs(Privileged) звонки и т. д. стали неактуальными, только то, как провайдер получает ограничения. Естественно, вопрос, оправдывают ли ваши требования хлопот, остается.

Другие вопросы по тегам