Роли не передаются в интеграцию picketlink 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 (из примеров быстрого запуска). Интересно, что если я пытаюсь прочитать роли, он всегда возвращает ноль:

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

Список ролей = (Список) request.getSession(). GetAttribute(GeneralConstants.ROLES_ID); <- ноль

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

привет Леон

1 ответ

Почему вы пытаетесь использовать picktlink, а также Spring Security? Я думаю, что вы должны выбрать один или другой. Как только ваш запрос будет принят весенней защитой, я не думаю, что вы можете передать контекст безопасности обратно в 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>

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

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