use*_*536 6 security authentication glassfish jakarta-ee
当从 Internet 向登录页面发出请求时,我从 netbeans glassfish 输出窗口得到了这个结果:
信息:JACC 策略提供者:权限检查失败:上下文(“WebApplication2/WebApplication2”),权限(“(“javax.security.jacc.WebUserDataPermission”“/login.xhtml”“GET”)“)
当从 LAN 或本地主机发出请求并且根据需要通过 HTTPS 提供页面时,不会发生这种情况。
我正在尝试将登录页面配置为在登录请求期间使用传输层安全保护用户密码。我希望这可以仅使用在 web.xml 部署描述符中具有声明性安全性的 Faces Servlet 来实现。
我使用基于表单的身份验证和非 j_security_check 自定义 Facelet 表单通过 request.login 方法进行编程登录。登录表单在 web.xml 中具有以下安全约束:
<security-constraint>
<display-name>secure login</display-name>
<web-resource-collection>
<web-resource-name>login.xhtml</web-resource-name>
<description/>
<url-pattern>/login.xhtml</url-pattern>
</web-resource-collection>
<user-data-constraint>
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
Run Code Online (Sandbox Code Playgroud)
没有授权约束元素,因为此表单显然适用于未经身份验证的用户。存在安全约束的唯一原因是可以将子元素设置为 CONFIDENTIAL 以确保安全连接。
Java EE 6 教程在此声明:
如果没有授权约束,容器必须接受请求而不需要用户认证
和
用户数据约束与基本和基于表单的用户身份验证结合使用很方便。当登录验证方法设置为 BASIC 或 FORM 时,密码不受保护,这意味着在未受保护的会话中客户端和服务器之间发送的密码可以被第三方查看和拦截。在用户身份验证机制中使用用户数据约束可以缓解这种担忧。在部署描述符中指定身份验证机制中描述了配置用户身份验证机制。
为什么 JACC 在访问此资源不需要此类检查时要进行权限检查?为什么它只从 Internet 失败而不是在 LAN 上失败?