当classloader命令被忽略时,Websphere 7基于窗体的身份验证PARENT_LAST
我有一个非常简单的web应用程序,它将spring安全性与j2ee声明性安全性集成在一起。 web.xml中的重要组成部分如下所示:当classloader命令被忽略时,Websphere 7基于窗体的身份验证PARENT_LAST
<security-role>
<role-name>ROLE_USER</role-name>
</security-role>
<security-role>
<role-name>ROLE_SUPERVISOR</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>All Resources</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>ROLE_USER</role-name>
<role-name>ROLE_SUPERVISOR</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/accessdenied.html</form-error-page>
</form-login-config>
</login-config>
该工程完全按照预期的Tomcat 6.0.33和Glassfish 3.1.1。当我将相同的应用程序迁移到Websphere 7.0.0.17时,我注意到我必须颠倒class加载器的顺序,将其标记为PARENT_LAST(因为WAS嵌入了一个真正旧版的commons-logging,它打破了webapp)。
我期望的行为是对是重定向到表单登录页面时,我要求在Web应用程序的资源。
我所看到的行为是不是用的WebSphere呈现登录表单保护的安全资源,它直接进入到“拒绝访问”弹簧安全从应用程序内提供。
我也尝试了BASIC而不是FORM作为auth方法,结果是一样的。
任何想法,我可能做错了什么?
编辑:禁用Spring Security会导致声明式安全性按预期工作。 这样的结论是,如果我想让内置的LoginFilter先启动,我必须在我的web.xml中明确声明它 - 给我一个对WAS的依赖:O(
编辑:我还发现这是火灾的应用程序中声明的过滤器前应用的声明安全;不管类加载器顺序正好这样
注意:我已启用管理安全,并正确映射的用户角色等。我使用websphere附带的“DefaultApp”验证了这一点,“snoop”servlet受到保护,并且挑战似乎在该应用程序中正常工作。
既然你说的web应用程序是真的很简单,我会走在另一个方向:从你的依赖关系中消除公共日志记录,并依赖WAS。 JCL很难从Websphere中脱颖而出(例如,请参阅我试图帮助的其他此类问题:Explanation of class loading in an EAR for non-requested but dependent class)。流行的提示是切换到PARENT_LAST,但相当多的人报告说它不适合他们。
通过你的依赖关系,看看JCL的依赖;如果您使用“nodep”罐子(包含所有依赖性的自包含),请将它们更改为单个罐子。 Maven是这方面的好帮手,如果你不使用它,那就是手动工作。