Authentication WebSphere Contextlistener未经过身份验证

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

我们有一个从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-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();