问题
我有一些代码与Weblogic JMX Beans交互,以获得有效用户的列表。此JMX调用需要访问权限,但我希望为未通过身份验证的用户运行此调用。
我的代码设置如下,基本问题是@RunAs
是否是我实现这一目标的方法,我只需要找出放置映射的正确位置,或者我是否应该以不同的方式来处理这一问题。
这在Weblogic 12.2.1.4上,目前作为战争文件部署
代码
这用于验证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
}
}
问题
对于未经认证的用户,服务方法以CCD_ 2失败;"修复"添加了一个允许公共访问JMX bean的策略,但我显然宁愿避免这种情况。
仔细研究,我相信我可以告诉Weblogic使用@RunAs
注释以不同的用户身份调用这些方法?我一直在玩这个,一点也不高兴。
AIUI@RunAs
注释只能与EJB一起使用,而不能与CDI管理的bean一起使用,所以我将服务bean更改为
@Stateless
@RunAs("MyRunAsRole")
public class MyServiceBean
当我看到时,它被拾取了
在EJB"MyServiceBean"中,我们无法确定要使用的主体名称作为角色"MyRunAsRole"运行。weblogic ejb jar部署描述符或相应的注释没有作为主体名称运行。。。
但我尝试映射它失败了。添加
<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
不起作用,但这是另一个问题。。。