You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring OAuth2自定义授权实现MFA:是否需校验PRE_AUTH权限?

Spring OAuth2 MFA 权限校验问题解答

关于MFATokenGranter中PRE_AUTH权限的校验

你需要手动实现这个校验,Spring OAuth2不会自动完成该逻辑。原因如下:

  • 你要限制仅CustomPasswordTokenGranter生成的token能进入MFATokenGranter流程,这属于自定义业务规则,框架没有内置对应逻辑。
  • 你当前代码里的判断逻辑有误:client.getAuthorities()获取的是OAuth客户端(Client)的权限,而非token所属用户的权限。正确做法是从传入的access_token中解析出用户的权限,再判断是否包含PRE_AUTH。

修正后的核心逻辑示例:

public class MfaTokenGranter extends AbstractTokenGranter {
    private final ResourceServerTokenServices tokenServices; // 注入token解析服务

    @Override
    protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
        // 从请求参数中获取传入的access_token
        String accessToken = tokenRequest.getRequestParameters().get("access_token");
        // 解析token获取用户认证信息
        OAuth2Authentication userAuth = tokenServices.loadAuthentication(accessToken);
        // 校验用户权限是否包含PRE_AUTH
        boolean hasPreAuth = userAuth.getAuthorities().stream()
            .anyMatch(authority -> PRE_AUTH.getAuthority().equals(authority.getAuthority()));
        if (!hasPreAuth) {
            throw new InvalidAuthorityException("当前token不具备MFA前置认证权限");
        }
        // 后续MFA校验逻辑...
    }
}

关于客户端权限的校验

如果你的核心需求只是限制带PRE_AUTH权限的token使用MFATokenGranter,那么上面的用户权限校验已经足够。如果还需要额外限制特定客户端调用该授权器,可以补充以下操作:

  • 在客户端配置中,给允许调用MFATokenGranter的客户端添加专属权限(比如MFA_GRANTER_ACCESS)
  • 在MFATokenGranter中校验client.getAuthorities()是否包含该专属权限

但结合你的需求场景,优先保证用户权限的校验即可满足“仅允许CustomPasswordTokenGranter生成的token使用MFATokenGranter”的要求。


内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:15:28