角色不会在tomcat7上的picketlink SPFilter集成中传输

时间:2014-07-22 08:29:35

标签: java tomcat7 single-sign-on picketlink

我认为我在这里遗漏了一些非常明显的东西,但是我花了大约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或我的代码。但是,从我在其他网址下的代码中我可以读取用户主体,它包含tomcat用户(来自快速入门示例)。有趣的是,如果我试图读取角色,它总是返回null:

Principal userPrincipal =(Principal)request.getSession()。getAttribute(GeneralConstants.PRINCIPAL_ID); &lt; - 返回具有正确用户名的主体

List roles =(List)request.getSession()。getAttribute(GeneralConstants.ROLES_ID); &lt; - null

如果删除安全约束,我可以毫无问题地访问应用程序和控制器。我正在使用示例中的基本重定向idp。

问候 利昂

1 个答案:

答案 0 :(得分:0)

为什么你试图使用picktlink和spring spring?我想你必须选择一个或另一个。一旦您的请求被Spring安全性接管,我认为您不能将安全上下文传递回picketlink。 Spring有点接管你的项目。 所以我所做的是使用常规的picketlink Web身份验证过滤器。然后我found我应该创建自己的组和角色过滤器来限制对某些目录的访问。

   <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>

我还没有尝试使用联合过滤器,所以请告诉我们你是怎么做的。