我在基于Spring的OAuth2提供程序的授权端点方面遇到了一些麻烦。我需要来自客户的更多信息,而不是目前可能的信息。这就是我想要实现的目标:
稍后我需要在身份验证过程中使用自定义参数。有没有简单的方法可以使用我的自定义扩展默认参数,还是我需要自己实现某个类?
对当前Spring代码中认证端点的工作原理进行了一些研究。我发现Authorization Endpoint使用method named authorize来获取所有正在设置的参数,然后将其转换为AuthorizationRequest。在进一步查看AuthorizationRequest类时,我发现它持有map with extensions,在整个授权过程中都会填充。但它似乎没有填充我的自定义参数(如上所示)。事实上这只是看代码,所以我可能错了。
使用我的自定义实现扩展AuthorizationEndpoint是一个好主意还是有更好更清晰的方法来执行此操作?
更新#1(07-10-2015)
我想使用自定义参数的地方在我自己的AuthenticationProvider实现中。我需要在本课程的authenticate method内提供信息。
更新#2(07-10-2015)
似乎AuthorizationProvider在AuthorizationEndpoint之前被调用。这意味着自定义参数是在我需要的类之后获得的(所以为时已晚)。
也许我可以通过扩展部分Spring安全类或通过JavaScript在HTML中获取引用来获取引用Url。这是一个好主意还是应该使用其他方法?
答案 0 :(得分:1)
所以我设法通过在Google上搜索更多内容来解决问题。 您需要做的是与HttpSessionRequestCache对话以获取引荐URL。这就是我在自己的AuthenticationProvider实现中解决它的方法
@Component
public class CustomProvider implements AuthenticationProvider {
@Autowired
private HttpServletRequest httpRequest;
@Autowired
private HttpServletResponse httpResponse;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(httpRequest, httpResponse);
logger.info("Referral URL: " + savedRequest.getRedirectUrl());
logger.info("Parameters: " + savedRequest.getParameterMap().keySet().toString());
}
}
这将打印出前往spring security登录页面之前调用的请求的URL。第二个日志方法打印出在此URL中找到的参数。 This question and answer帮助我为我的问题创建解决方案。