JSF Web应用使用@RunAs实现指定用户身份执行Weblogic JMX调用问题咨询
解决方案
方案可行性确认
@RunAs 搭配无状态EJB是Weblogic 12c下实现该需求的标准可行方案,完全符合最小权限原则,不需要放开JMX Bean的公开访问权限。
你之前配置失败的核心原因
你配置的run-as-role-assignment放在weblogic.xml中仅对Web层组件生效,对EJB组件无效;且你提到的weblogic-wjb-jar.xml属于拼写错误,正确的EJB专属部署描述符为weblogic-ejb-jar.xml。
正确配置步骤
- 保留你已完成的修改:将
MyServiceBean改为@Stateless无状态EJB,添加@RunAs("MyRunAsRole")注解 - 保留
web.xml中已添加的security-role配置 - 在WAR包的
WEB-INF目录下新建weblogic-ejb-jar.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <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>
- 确认
privUser是Weblogic当前安全域中存在的有效用户,且该用户已被分配MyRunAsRole角色,该角色已拥有访问目标JMX Bean的权限(和之前给认证用户配置的JMX策略一致即可)
备选实现方案(无需EJB)
如果不想引入EJB组件,也可以在代码中主动切换身份执行JMX调用,示例如下:
@RequestScoped public class MyServiceBean { public List<String> listUsers() { Subject originalSubject = weblogic.security.Security.getCurrentSubject(); try { // 切换为有权限的用户身份 Subject privSubject = weblogic.security.Authentication.login("privUser", "你的用户密码".toCharArray()); return weblogic.security.Security.runAs(privSubject, (PrivilegedAction<List<String>>) () -> { // 原有JMX调用逻辑 // ... }); } catch (LoginException e) { throw new RuntimeException("身份切换失败", e); } finally { // 恢复原请求身份 weblogic.security.Security.runAs(originalSubject); } } }
该方案无需额外部署描述符配置,缺点是需要妥善存储有权限用户的认证凭据,可根据自身场景选择。
内容的提问来源于stack exchange,提问作者Jameson_uk
相关产品推荐
相关产品推荐

