【发布时间】:2014-06-13 12:57:38
【问题描述】:
我有一个安全约束,涵盖了我的 Web 应用程序中的一些页面。使用 JAAS 和表单进行身份验证,并且工作正常。 (我已经成功实现了我的 LoginModule)。
但是我需要通过 servlet 进行备用身份验证。
这是servlet的代码:
try {
TokenCallbackHandler tokenCallbackHandler = new TokenCallbackHandler(properties,token);
LoginContext lc = new LoginContext("myApp", tokenCallbackHandler);
lc.login();
} catch (LoginException e) {
e.printStackTrace();
}
调试代码我看到调用初始化、登录和提交都没有错误。 servlet 返回一个带有 js 的 html 页面,该页面重定向到受保护的资源:
function doRedirect() {
location.href = "/protectedPath/ProtectedResource.html";
}
window.setTimeout("doRedirect()", 1);
但是当浏览器试图获取受保护的页面时,应用服务器会返回登录页面。
我错过了什么? 使用 js 重定向可能会丢失会话 cookie? 或者,问题是否可能是我正在尝试(通过重定向)从未受保护的资源访问受保护的资源?
-- 编辑 ---
我查看了 cookie:当我使用 servlet 登录时,它返回一个会话 cookie,当我尝试获取受保护的资源时,我可以看到浏览器将该会话 cookie 传递给服务器,但似乎它被拒绝了,实际上它用另一个会话 cookie 响应,进入登录表单页面
-- 编辑 ---
用另一种方式解决。
在对tomcat身份验证机制进行了一些调查之后,我意识到我试图做的事情是错误的。
已经定义了一个安全约束和一个表单登录配置来保护我的资源,我已经告诉 tomcat 以它的方式管理身份验证。因此,只要我没有通过 tomcat 身份验证工作流程,我就无法验证任何内容。我还发现不可能在同一个 Web 应用程序中配置不同的登录配置,因此定义了表单身份验证会阻止我以其他方式进行身份验证。可能我需要的是 BaseAuthenticator 类的自定义实现(FormAuthenticator、BasicAuthenticator 等的基类,包含相应登录配置的代码),但我不确定这可能是一个好主意,也许是一个安全过滤器将是一个更好的解决方案。
对 tomcat 中的安全过滤器有所了解,我暂时设法解决了在我的 servlet 中模拟表单身份验证的问题(我知道,真的很糟糕)。
【问题讨论】:
-
成功登录后,您是否在 servlet 代码中的任何位置创建会话?
-
如果它被拒绝,那么要么是 cookie 上的路径不同,要么是 cookie 在设置时不安全,但您正在重定向到安全端点?
-
好建议,我在 servlet 中创建了一个新会话,但没有任何改变,但是现在我尝试使用测试,形成我可以看到的表单身份验证返回一个 set-cookie 标头。跨度>
-
我正在重定向到安全成本约束所涵盖的路径中的页面。也许cookie不安全?我必须检查一下,从现在开始,当我调用我的 servlet 并且 servlet 返回相同的 cookie 时,我可以看到 cookie 从浏览器开始。
-
cookie 的值有变化吗?登录后,检查 cookie 的值,然后在重定向后检查值。如果它们不同,那就可以解释了。
标签: java tomcat servlets jaas security-constraint