我假设我在这里遗漏了一些非常明显的东西,但我花了大约 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/ 下的某些内容时,我什至没有进入 SPFilter 或我的代码就会得到 403。但是,从我在其他 url 下的代码中,我可以读取用户主体,它包含 tomcat 用户(来自快速入门示例)。有趣的是,如果我试图读取角色,它总是返回 null:
委托人 userPrincipal = (Principal) request.getSession().getAttribute(GeneralConstants.PRINCIPAL_ID); <-- 返回具有正确用户名的主体
列出角色 = (List) request.getSession().getAttribute(GeneralConstants.ROLES_ID); <- 空
如果我删除安全约束,我可以毫无问题地访问应用程序和控制器。我正在使用示例中的基本重定向 idp。
问候莱昂