Роли не передаются в интеграцию SPFilter пикетной ссылки на tomcat7

Я предполагаю, что у меня отсутствует кое-что очень очевидное здесь, но я потратил около 4 часов на поиск и попытку и не смог прийти к решению, так что, возможно, есть какая-то помощь. Я следил за этим руководством: https://docs.jboss.org/author/display/PLINK/Standalone+Web+Applications%28All+Servlet+Containers%29 Я смог подключить свой SP и мой IDP и выполнить вход в систему. В сеансе я вижу участника-пользователя. Однако, как только я добавлю защиту tomcat, чтобы защитить часть приложения, как в приведенном выше примере, это не сработает. Вот соответствующие разделы web.xml

<filter>
 <description>
 The SP Filter intersects all requests at the SP and sees if there is a need to contact the IDP.
 </description>
 <filter-name>SPFilter</filter-name>
 <filter-class>org.picketlink.identity.federation.web.filters.SPFilter</filter-class>
 <init-param>
 <param-name>ROLES</param-name>
 <param-value>sales,manager</param-value>
 </init-param>
 <init-param>
 <param-name>IGNORE_SIGNATURES</param-name>
 <param-value>true</param-value>
 </init-param>
</filter>


<filter-mapping>
 <filter-name>SPFilter</filter-name>
 <url-pattern>/login</url-pattern>
</filter-mapping>


<!-- Processes application requests -->
<servlet>
 <servlet-name>appServlet</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/servlet-context.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
 <servlet-name>appServlet</servlet-name>
 <url-pattern>*.html</url-pattern>
</servlet-mapping>


<security-constraint>
 <web-resource-collection>
 <web-resource-name>Manager command</web-resource-name>
 <url-pattern>/loginarea/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
 <role-name>manager</role-name>
 </auth-constraint>
</security-constraint>
<security-role>
 <description>
 The role that is required to log in to the Manager Application
 </description>
 <role-name>manager</role-name>
</security-role>

Всякий раз, когда я пытаюсь получить доступ к чему-либо под /loginarea/, я получаю 403, даже не дойдя до SPFilter или моего кода. Однако из моего кода под другими URL-адресами я могу прочитать принципал пользователя, и он содержит пользователя tomcat (из примеров быстрого запуска). Интересно, что если я пытаюсь прочитать роли, он всегда возвращает null:

Основной пользовательPrincipal = (Principal) request.getSession(). GetAttribute (GeneralConstants.PRINCIPAL_ID); <- возвращает принципала с правильным именем пользователя

List role = (List) request.getSession(). GetAttribute (GeneralConstants.ROLES_ID); <- null

Если я удалю ограничение безопасности, я могу без проблем получить доступ к приложению и контроллеру. Я использую базовый redirect idp из примеров.

рассматривает Леона

1 ответ

почему вы пытаетесь использовать picktlink, а также весеннюю безопасность? Я думаю, вам нужно выбрать тот или другой. Как только ваш запрос будет захвачен весной безопасности, я не думаю, что вы можете передать контекст безопасности обратно на picketlink. Весенний вид берет ваш проект. Так что я сделал, это использовать регулярный фильтр проверки подлинности picketlink. И затем я обнаружил, что должен создать свои собственные фильтры групп и ролей, чтобы ограничить доступ к определенным каталогам.

<filter>
 <filter-name>PicketLinkAuthenticationFilter</filter-name>
 <filter-class>org.picketlink.authentication.web.AuthenticationFilter</filter-class>

 <init-param>
 <param-name>authType</param-name>
 <param-value>FORM</param-value>
 </init-param>
 </filter>

Я не пытался использовать материал фильтра федерации, но дайте нам знать, как вы это делаете.

licensed under cc by-sa 3.0 with attribution.