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
相关产品推荐
相关产品推荐

