我有一个使用 ejb(单独部署)的 Web 应用程序,登录是通过 JAAS 处理的。在当前会话期间,在身份验证后访问不安全的 url时,我可以获得调用者主体吗?
更多细节如下。
ejb:
简单 EJB 在 WAS (WebShere 7) 中注册。它有一种打印主体的方法:
ctx.getCallerPrincipal().getName();
网络应用程序:
Web 应用程序(单独部署)有 2 个 servlet。一个映射到不安全的路径,另一个是安全的,即它的路径注册web.xml
在下<security-constraint>
。Servlet 将 EJB 注入其中(通过@EJB
注解)。EJB 绑定有效。Webapp 使用基于表单的身份验证,使用 JAAS:有一个登录表单j_security_check
,j_username
等等。WAS 被配置为使用安全性(使用本地操作系统),并且 webapp 角色映射到应用程序领域中的 All Authenticated。
登录作品:
简而言之,上述配置有效:如果我访问安全页面 ( /secure/index.html
),WAS 会显示登录表单(如果尚未登录),我可以在其中输入我的用户名和密码并继续执行;调用 EJB 并获取主体,打印出我的用户名。正如预期的那样。
登录后访问不安全的资源
但是,如果我访问不安全的 servlet ( /index.html
),EJB *无法获取调用者主体并打印出:UNAUTHENTICATED
for user name。无论我是否登录,都会发生这种情况。
问题
在当前会话期间,在身份验证后访问不安全的 url 时,我能否以某种方式获取调用者主体?
我不确定 JAAS 是否在规范中定义了这个用例?或者我应该手动处理这个(例如使用会话并将调用者主体注入线程本地)。