如何扩展ForgeRock AM的AbstractDecisionNode添加'redirect'结果?
ForgeRock AM AbstractDecisionNode 添加'redirect'结果实现方案
一、定义节点结果枚举
先扩展节点的结果枚举,把redirect纳入合法结果,确保AM能识别并处理这个结果分支:
public enum CustomCollectorNodeOutcome { SUCCESS, FAILURE, REDIRECT; @Override public String toString() { return name().toLowerCase(); } }
二、实现自定义收集器节点
继承AbstractDecisionNode,在元数据中声明新增的redirect结果,同时在业务逻辑里判断用户操作,返回对应结果:
import org.forgerock.openam.auth.node.api.AbstractDecisionNode; import org.forgerock.openam.auth.node.api.Action; import org.forgerock.openam.auth.node.api.NodeProcessException; import org.forgerock.openam.auth.node.api.TreeContext; import org.forgerock.util.i18n.PreferredLocales; import javax.inject.Inject; import java.util.Map; public class CustomCollectorNode extends AbstractDecisionNode<CustomCollectorNodeOutcome> { @Inject public CustomCollectorNode() { super(CustomCollectorNodeOutcome.class); } @Override public Action process(TreeContext context) throws NodeProcessException { Map<String, String[]> formParams = context.request.parameters; // 判断用户是否点击了触发重定向的按钮(假设按钮name为"triggerRedirect") if (formParams.containsKey("triggerRedirect")) { // 从节点配置或共享状态中获取目标跳转URL String targetUrl = "https://your-domain.com/logout"; // 返回REDIRECT结果并附加重定向指令 return Action.redirectTo(targetUrl).build(); } // 处理常规提交逻辑 if (formParams.containsKey("submit")) { // 验证通过返回SUCCESS return Action.goTo(CustomCollectorNodeOutcome.SUCCESS).build(); } else { // 验证失败返回FAILURE return Action.goTo(CustomCollectorNodeOutcome.FAILURE).build(); } } @Override public String getDisplayName(PreferredLocales locales) { return "带重定向功能的收集器节点"; } @Override public String getDescription(PreferredLocales locales) { return "支持触发重定向/注销操作的收集器节点,点击指定按钮返回redirect结果"; } }
三、收集器前端配置
在收集器的表单中添加触发重定向的按钮,确保点击时提交对应参数:
<form method="post" action="${authServiceUrl}"> <!-- 业务收集字段 --> <input type="text" name="phoneNumber" placeholder="请输入手机号"> <!-- 常规提交按钮 --> <button type="submit" name="submit">确认提交</button> <!-- 触发重定向的按钮 --> <button type="submit" name="triggerRedirect">注销并返回首页</button> <!-- AM自动生成的必要隐藏字段 --> <input type="hidden" name="realm" value="${realm}"> <input type="hidden" name="authIndexType" value="service"> <input type="hidden" name="authIndexValue" value="${treeName}"> </form>
四、认证树流程配置
在AM控制台的认证树中添加该节点后:
- 将
redirect结果分支直接指向终止节点,或利用Action.redirectTo()完成跳转无需后续节点 - 确保节点权限配置正确,允许触发重定向操作
内容的提问来源于stack exchange,提问作者NickH48226
相关产品推荐
相关产品推荐

