У меня есть веб-приложение на 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 не определены роли, простогрупп.Любые объяснения приветствуются.