我有一个使用ejb(单独部署)的Web应用程序,登录通过JAAS处理。在身份验证后,在当前会话期间访问不安全的网址时,是否可以获取来电主体?
更多细节如下。
简单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在应用程序的领域中进行身份验证。
为了简短起见,以上配置有效:如果我访问安全页面(/secure/index.html
),WAS会显示登录表单(如果尚未登录),我可以在其中输入用户名和密码并继续执行;调用EJB并获取主体,打印出我的用户名。正如所料。
但是,如果我访问不安全的servlet(/index.html
),则EJB * cant 获取调用者主体并打印出:UNAUTHENTICATED
作为用户名。无论我是否登录,都会发生这种情况。
在当前会话期间,在身份验证后访问不安全的URL时,我能以某种方式获得调用者主体吗?
我不确定JAAS是否在规范中定义了这个用例?或者我应该手动处理这个问题(例如使用会话并将调用者主体注入本地线程)。
答案 0 :(得分:1)
您可能应该更改Web身份验证的默认行为,而不是为不受保护的URL提供身份验证数据。
应启用“在访问不受保护的URI时使用可用的身份验证数据”选项
总的来说,我强烈建议您阅读WebSphere Application Server V7.0 Security Guide,了解安全性如何在WAS中发挥作用。