我在我的webapp中使用基于声明的J2EE表单身份验证,遵循各处提供的说明,例如:http://java.dzone.com/articles/understanding-web-security
通过j_security_check登录似乎允许领域内的所有用户进行身份验证(登录),但不检查他们的角色。 授权检查似乎只在用户访问具有安全约束的页面时执行。
所以在我的应用程序中,用户能够成功登录,因为他们在领域,但是当他们访问安全页面时,他们会收到一个丑陋的“错误403:AuthorizationFailed”消息。
有没有办法将身份验证限制为具有特定角色的用户?或者我需要确保用户领域仅包含具有所需角色的用户。
就代码而言,我在web.xml中有这个声明:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Simple</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/loginerror.jsp</form-error-page>
</form-login-config>
</login-config>
但它没有说明所需的角色,因此任何导航到login.jsp的用户都可以成功登录,如果他们在令人满意的情况下。
然后,当用户访问url-pattern匹配的任何页面时:
<security-constraint>
<display-name>Authorised</display-name>
<web-resource-collection>
<web-resource-name>Authenticated and Authorised Resources</web-resource-name>
<url-pattern>/secure/*</url-pattern>
<http-method>PUT</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>simpleWebAppUser</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>INTEGRAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
检查角色的时候。
角色“simpleWebAppUser”是应用程序范围的,我想在让登录成功之前检查用户是否具有此角色。
我正在使用WebSphere 7.0,配置为在Windows XP / 2000/2003上使用O / S用户存储库。
答案 0 :(得分:2)
有没有办法限制身份验证 对具有特定角色的用户?
没有。身份验证是建立身份的过程,而不是执行访问控制检查的过程。这就是JAAS(以及Java Servlet规范)如何处理这个主题;大多数其他系统也会以类似的方式实现身份验证。
如果您可以修改应用程序以显示“安全页面”,那么只有当用户处于特定角色时(Servlet API通过HttpServletRequest的isUserInRole方法允许这样做),那么您将节省你自己有些胃灼热(同时实施下面列出的建议)。
或者我需要确保用户 领域只包含用户 要求的角色。
如果可能的话,你可以这样做。但是,您也可以通过编写自己的JAAS LoginModule来解决此问题,该JAAS LoginModule仅在用户也映射到所需角色(应用程序代码识别)时才成功验证用户身份。您还必须配置应用程序服务器和Web应用程序以使用此登录模块。
答案 1 :(得分:2)
对于发现有用的人,我根据此处的说明找出了另一种解决方案:http://software-security.sans.org/blog/2010/08/11/security-misconfigurations-java-webxml-files/
如果我将以下内容添加到web.xml:
<error-page>
<error-code>403</error-code>
<location>/authorizationerror.jsp</location>
</error-page>
然后,每当用户以错误的角色访问安全页面时,就会显示一个页面,说明他们没有足够的权限访问该页面。
如果应用程序中唯一的非安全页面是登录页面,那么他们将在登录后立即看到该页面。