在 JSF Webapp 中以不同用户身份执行代码

Execute code as different user in JSF Webapp

问题

我有一些代码可以与 Weblogic JMX Beans 交互以获得有效用户列表。此 JMX 调用需要访问权限,但我想为未经过身份验证的用户提供此 运行。

我的代码设置如下,基本问题是 @RunAs 是否是我可以实现此目的的方式,我只需要找出放置映射的正确位置,或者我是否应该接近这个另一种方式。

这是在 Weblogic 12.2.1.4 上,目前部署为 war 文件

代码

这用于验证 JSF 页面中的表单条目,这适用于经过身份验证的用户,我已经为 JMX bean 创建了 JMX 策略,但我想将其扩展到未经过身份验证的用户。

我有一串 类 看起来像

@Named
@ViewScoped
public class MyBackingBean {

  @Inject
  private MyBusinessBean myBusBean;

  private List<String> users;

  public void listUsers() {
    users = myBusBean.listUsers();
  }
}
@RequestScoped
public class MyBusinessBean {
  
  @Inject
  private MyServiceBean myServBean;

  public List<String> listUsers() {
    return myServBean.listUsers();
  }
}
@RequestScoped
public class MyServiceBean {
  
  public List<String> listUsers() {
    // Some code here to accesss JMX bean
  }
}

问题

对于未经身份验证的用户,服务方法失败并显示 weblogic.management.NoAccessRuntimeException,我可以通过添加允许 public 访问的策略来 “修复” JMX bean,但我显然宁愿避免它。

四处挖掘我相信我可以告诉 Weblogic 使用 @RunAs 注释以不同用户的身份调用这些方法?我一直在玩这个没有乐趣。

AIUI @RunAs 注解只能与 EJB 一起使用,不能与 CDI 管理的 bean 一起使用,所以我将服务 bean 更改为

@Stateless
@RunAs("MyRunAsRole")
public class MyServiceBean

如我所见

In EJB 'MyServiceBean' we could not determine a principal-name to use for the run-as-role 'MyRunAsRole'. The weblogic-ejb-jar deployment descriptor or corresponding annotation has no run-as-principal-name...

但我尝试绘制此地图的尝试失败了。添加

<security-role>
  <role-name>MyRunAsRole</role-name>
</security-role>

到web.xml和

<run-as-role-assignment>
  <role-name>MyRunAsRole</role-name>
  <run-as-principal-name>privUser</run-as-principal-name>
</run-as-role-assignment>

到weblogic.xml

仍然给我关于无法映射到主体的错误。

run-as-role-assignment 肯定被读取,因为当我忘记将角色添加到 web.xml 时它抱怨安全角色不存在。

我也试过将 run-as-role-assignment 块添加到 weblogic-wjb-jar.xml 文件中,但也没有被拾取。

重要的一点是它被打包为 WAR 文件。

经过一些试验后,我通过在 WEB-INF 中放置一个 weblogic-wjb-jar.xml 文件而不是 META-INF

使它像上面那样工作
<weblogic-ejb-jar xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar  http://xmlns.oracle.com/weblogic/weblogic-ejb-jar/1.6/weblogic-ejb-jar.xsd"> 
  <run-as-role-assignment>
    <role-name>MyRunAsRole</role-name>
    <run-as-principal-name>privUser</run-as-principal-name>
  </run-as-role-assignment>
</weblogic-ejb-jar>

@RolesAllowed 没有用,但这是另一个问题...