Weblogic 12.2.1.2 аутентифицирует область безопасности, но при вызове isUserInRole возвращается false. - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть веб-приложение на Java, над которым я работаю, которое выполняет аутентификацию с использованием токена SSO (SPNEGO).Область безопасности и провайдеры настраиваются на сервере Multitenancy WebLogic (12.2.1.2), и все, кажется, работает нормально, за исключением случаев, когда выполняется вызов isUserInRole.Это всегда возвращает ложь.Пользователь проходит проверку подлинности, субъект создается и заполняется всеми правильными принципалами (группами) из AD.Я попытался сопоставить Принципалы с назначением роли безопасности в файле weblogic.xml и использую это назначение роли в файле web.xml, чтобы попытаться сопоставить роль определенному Принципалу (Группе), но он не работает, как я думал.

Приложение состоит из одного сервлета в WAR, который должен отображать информацию для входа на экран, если аутентификация прошла успешно.Аутентификация прошла успешно, и информация отображается, и я вижу свое имя из AD и всех Принципалов (Групп), к которым я принадлежу.

Конфигурация для weblogic.xml и web.xml

weblogic.xml

  <security-role-assignment>
    <role-name>SITE_ADMIN</role-name>
    <principal-name>@DEV_ADMIN</principal-name>
    <principal-name>DEV_ADMIN</principal-name>
</security-role-assignment>

web.xml

<servlet>
     <servlet-name>AuthSimpleTestServlet</servlet-name>
     <servlet-class>functional.test.SimpleTestServlet</servlet-class>
 </servlet>
 <servlet-mapping>
     <servlet-name>AuthSimpleTestServlet</servlet-name>
     <url-pattern>/*</url-pattern>
 </servlet-mapping>
 <security-constraint>
    <web-resource-collection>
        <web-resource-name>secured pages</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>SITE_ADMIN</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>
 <login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>myrealm</realm-name>
</login-config>
<security-role>
    <description>Admin Role</description>
    <role-name>SITE_ADMIN</role-name>
</security-role>

Когда я использую браузер для проверки аутентификации, я аутентифицируюсь, и сервлет отображает мое имя пользователя, все мои Принципалы и некоторая другая информация точно так же, как если бы я был аутентифицирован.

Запрошенный URL: http://dev -сервер: 7011 / CHAD / SPNEGO_TEST

Запрос информации:

Метод запроса: GET

Запрос URI: / CHAD / SPNEGO_TEST

Протокол запроса: HTTP /1.1

Путь сервлета:

Информация о пути:

Путь переведен:

Строка запроса:

Длина содержимого:

Тип содержимого:

Имя сервера: dev-server

Порт сервера: 7011

Удаленный пользователь: DCConway

Схема: http

Схема авторизации: CLIENT_CERT

Схема запроса: http

Запрос принципала: DCConway

Попыткавыполнить аутентификацию с использованием HttpServletRequest.authenticate: true

HttpServletRequest.isUserInRole (SITE_ADMIN): false

Имя веб-логика-> weblogic.security.SubjectUtils.get * Имя пользователя (Subject): 1062on *Количество принципалов от субъекта: 47

Список участников: (список отредактирован для публикации)

DCConway

DEV_ADMIN

@DEV_ADMIN

Заголовки запроса:

Принять: текст / html, приложение / xhtml + xml, изображение / jxr, /

Accept-Language: en-US

User-Agent: Mozilla / 5.0 (Windows NT 10.0

WOW64

Trident / 7.0

rv: 11.0) как Gecko

Accept-Encoding: gzip, deflate, peerdist

Хост: dev-сервер: 7011

DNT: 1

Соединение: Keep-Alive

Cookie: JSESSIONID = YAAx-omzQbMg4jE-bedCM-5Guwngj56xAmXVIqhcbFSJxti7Ae6J! 2096529829

Авторизация: согласование YIILJ-PeerDist: версия = 1.1

X-P2P-PeerDistEx: MinContentInformation = 1.0, MaxContentInformation = 2.0

Атрибуты запроса:

weblogic.servlet.network_channel.port: type = java.lang.Integer str = '7011'

В результате проверки подлинности я вижу, что использование запроса сервлета для получения удаленного пользователя работает.Я вижу, что использование Принципала для получения имени пользователя работает.Вызов аутентификации с использованием запроса сервлета работает, и я вижу все мои Принципалы.Сейчас я в растерянности, пытаясь понять, почему вызов isUserInRole не возвращает true.Я предполагаю, что что-то в принципале для сопоставления ролей неверно, но я не вижу, где я все испортил.

Я полагаю, что я мог бы просто использовать принципы для обеспечения безопасности и ограничения пользователей, основываясь на них, но я действительно хотел бы знать, что и где я испортил сопоставления, или это потому, что в AD не определены роли, простогрупп.Любые объяснения приветствуются.

...