我有一个安全约束,涵盖了我的 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 中模拟表单身份验证的问题(我知道,这真的很糟糕)。