Authentication WebSphere Contextlistener未经过身份验证
我们有一个从WAS 5移植到WAS 8的as应用程序。经过一些更改后,我发现上下文侦听器并没有作为经过身份验证的用户执行 我们有以下web应用定义:Authentication WebSphere Contextlistener未经过身份验证,authentication,websphere,Authentication,Websphere,我们有一个从WAS 5移植到WAS 8的as应用程序。经过一些更改后,我发现上下文侦听器并没有作为经过身份验证的用户执行 我们有以下web应用定义: <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>InDiaServerMonitoring</display-name>
<listener>
<description>
</description>
<display-name>
Timer Control Listener</display-name>
<listener-class>servlet.TimerControlListener</listener-class>
</listener>
<servlet>
<display-name>
MonitoringServlet</display-name>
<servlet-name>MonitoringServlet</servlet-name>
<servlet-class>servlet.MonitoringServlet</servlet-class>
<run-as>
<role-name>monitor</role-name>
</run-as>
</servlet>
<servlet-mapping>
<servlet-name>MonitoringServlet</servlet-name>
<url-pattern>/MonitoringServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<security-role>
<role-name>monitor</role-name>
</security-role>
<ejb-local-ref id="EJBLocalRef_1213267259466">
<description>
</description>
<ejb-ref-name>ejb/Service</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>business.ServiceControllerLocalHome</local-home>
<local>business.ServiceControllerLocal</local>
<ejb-link>Services.jar#ServiceController</ejb-link>
</ejb-local-ref>
</web-app>
上下文侦听器不能有任何与之关联的运行方式角色。 您正试图从该上下文侦听器调用
(Bean)Prj#EJB.jar#ServiceController stopTimers
,该侦听器看起来是安全的,需要匿名用户无法访问的用户
因此,您有以下解决方案:
1) 在您的上下文中使用编程登录,代码与此类似:
// create login context
LoginContext lc = new LoginContext( "WSLogin", new WSCallbackHandlerImpl(userid, password));
// do login
lc.login();
// retrieve subject
Subject subject = lc.getSubject();
// set new identity
WSSubject.setRunAsSubject(subject);
// call session bean
itrServiceController.stopTimers();
// logout - destroy credentials
lc.logout();
2) 将中间servlet或EJB与runas角色集一起使用
因此,从您的侦听器中,您只需调用servlet或本地会话bean,该bean将具有runAs角色集,该bean只需使用与角色user关联的方法调用您的ItrServiceController
这可能更容易,因为它允许在部署时定义用户/角色映射 实际上,这两个部分都是在一个项目中定义的,该项目在runasuser with user中定义了一个角色监视,该角色监视页面(通知此上下文侦听器)运行良好,但该用户不用于任何经过身份验证的用户所在的控制器required@JanPešta嗯,我没有得到你的解释。Servlet上下文不是由页面通知的,而是在应用程序启动时由容器通知的。监控Servlet是关于监控应用程序状态的,并且该Servlet已经为角色监控定义了runAsUser。我们认为monitoring和ServiceController位于同一个项目中,其中定义了runAsUser进行监视,ServiceController对任何经过身份验证的用户都具有访问级别。
// create login context
LoginContext lc = new LoginContext( "WSLogin", new WSCallbackHandlerImpl(userid, password));
// do login
lc.login();
// retrieve subject
Subject subject = lc.getSubject();
// set new identity
WSSubject.setRunAsSubject(subject);
// call session bean
itrServiceController.stopTimers();
// logout - destroy credentials
lc.logout();