我在 Java EE 中遇到了有关身份验证的问题。让我先介绍一下我正在使用哪些技术:
- Jboss AS 7.1
- JAAS 数据库登录模块
- RESTeasy
我将尝试像这样组织我的问题:
我知道它有效的行为:
我在我的 web.xml 文件中指定“/index.html”作为受保护的资源,并在我的“jboss-web.xml”文件中指定安全域。访问“index.html”会将用户重定向到“login.html”表单页面。此页面的提交表单与“j_security_check”一起使用,并且容器正确地进行了身份验证。如果我调用获取“request.getPrincipal()”的 REST 服务,我将成功获取主体信息。此外,由于用户已登录,因此验证了对另一个受保护资源的访问。一切还好。
我想要的行为(我尝试过但缺少一些东西):
我希望能够调用 login.html 并将操作提交给 REST 服务中的登录方法。这个休息服务将调用登录方法(现在我正在使用 request.login(username,password))并执行登录过程。在随后对不同 REST 服务的调用中,req.getPrincipal() 将获取登录用户的凭据。
所需行为的问题:
在我的 REST 服务中调用登录方法后,登录效果很好,但是下次我尝试从请求或 SecurityContext 类中获取主体信息时,它为空。如果我尝试访问受保护的资源(比方说,另一个 html)容器无法识别该用户已登录。
看起来像在没有提前请求任何受保护资源的情况下“手动”登录不会触发容器中的身份验证机制,因为在我执行此“手动登录”之后,下次我调用 request.getPrincipal() 时完全为空,我不能从我的业务服务中获取用于请求个性化信息的主要信息。
为什么要这样做:
实现此行为的目的是我不想将身份验证依赖于整个html页面,而是在其他页面中嵌入一个小的登录表单,调用容器中的身份验证机制。但是,是的,如果有人试图访问应用程序内的受保护资源,我想将该操作重定向到登录表单页面。
您可能会回复的所有内容都将非常有帮助,在此先感谢您。
迭戈