如何在JSF应用中获取Security-Role所映射的Principal-Name?
获取WebLogic JSF应用中安全角色与主体的映射关系
刚好之前在WebLogic环境下处理过类似需求——要给未认证用户展示安全角色对应的WebLogic群组,其实可以通过WebLogic提供的部署描述符API直接读取weblogic.xml里的配置,完全不需要依赖已认证用户的上下文。
下面是具体的实现步骤:
1. 确保WebLogic API可用
WebLogic的weblogic.jar里包含了我们需要的类,在WebLogic服务器上运行的应用默认会自动加载这个jar包;本地开发的话,记得把它加入项目依赖中。
2. 编写工具类读取映射关系
创建一个工具类,通过WebLogic的Deployment API来解析weblogic.xml中的security-role-assignment配置:
import weblogic.deploy.api.tools.SessionHelper; import weblogic.deploy.api.model.WebLogicDeploymentManager; import weblogic.deploy.api.model.WebLogicDDBeanRoot; import weblogic.servlet.descriptor.WebAppBean; import weblogic.xml.security.dd.SecurityRoleAssignmentBean; import weblogic.xml.security.dd.SecurityRoleAssignmentsBean; import java.util.HashMap; import java.util.Map; public class SecurityRoleMappingHelper { // 返回安全角色到主体名的映射 public static Map<String, String> getRolePrincipalMappings() { Map<String, String> roleMap = new HashMap<>(); try { // 获取当前应用的DeploymentManager WebLogicDeploymentManager deployManager = SessionHelper.getDeploymentManager(); // 获取weblogic.xml的根配置Bean WebLogicDDBeanRoot wlDD = deployManager.getWebLogicDDBeanRoot(); WebAppBean webAppBean = (WebAppBean) wlDD.getDescriptorBean(); // 读取安全角色分配配置 SecurityRoleAssignmentsBean roleAssignments = webAppBean.getSecurityRoleAssignments(); if (roleAssignments != null) { for (SecurityRoleAssignmentBean assignment : roleAssignments.getSecurityRoleAssignments()) { String roleName = assignment.getRoleName(); // 这里假设每个角色对应一个主体,多主体的话可以改成List存储 String principalName = assignment.getPrincipalNames()[0]; roleMap.put(roleName, principalName); } } } catch (Exception e) { // 实际项目里建议换成日志记录,别直接打印栈轨迹 e.printStackTrace(); } return roleMap; } }
3. 在JSF Managed Bean中暴露数据
把映射关系放到一个ApplicationScoped的Managed Bean里,这样页面可以直接访问:
import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; import java.util.Map; @ManagedBean(name = "roleGuideBean") @ApplicationScoped public class RoleGuideBean { private final Map<String, String> rolePrincipalMap; public RoleGuideBean() { // 初始化时读取映射关系 this.rolePrincipalMap = SecurityRoleMappingHelper.getRolePrincipalMappings(); } public Map<String, String> getRolePrincipalMap() { return rolePrincipalMap; } }
4. 前端页面展示给未认证用户
在XHTML页面里,用JSF的标签遍历映射关系,展示权限申请指引:
<h:panelGroup> <h3>权限申请指引</h3> <ul> <ui:repeat value="#{roleGuideBean.rolePrincipalMap.entrySet()}" var="entry"> <li>若要获得*#{entry.key}*权限,请申请加入WebLogic群组:#{entry.value}</li> </ui:repeat> </ul> </h:panelGroup>
几个小提示
- 如果你的安全角色对应多个主体,把工具类里的
Map<String, String>改成Map<String, List<String>>,遍历assignment.getPrincipalNames()即可。 - 确保应用在WebLogic上有足够的权限读取部署描述符,默认情况下运行在服务器上的应用都有这个权限;本地测试如果遇到权限问题,可以调整WebLogic的启动参数。
- 这个方法完全不依赖用户认证状态,所以未登录用户也能正常看到这些信息。
内容的提问来源于stack exchange,提问作者Jameson_uk
相关产品推荐
相关产品推荐

