我目前正试图绕过Spring Security OAuth2中 access authorization 进程的批准/拒绝步骤,因为先前授权的访问(针对特定的client_id和user_id)应该被记忆,并允许将OAuth应用程序重定向到客户端应用程序而不用用户每次被要求获得批准 .
<version.spring-security>3.2.0.RELEASE</version.spring-security>
<version.spring-security-oauth>1.0.5.RELEASE</version.spring-security-oauth>
所以我有一个AccessConfirmationController,它具有/ oauth / confirm_access endpoints 的映射:
@RequestMapping("/oauth/confirm_access")
public ModelAndView getAccessConfirmation(@ModelAttribute final AuthorizationRequest clientAuth)
{
final ClientDetails client = this.clientDetailsService.loadClientByClientId(clientAuth.getClientId());
final TreeMap<String, Object> model = Maps.newTreeMap();
model.put("auth_request", clientAuth);
model.put("client", client);
return new ModelAndView("access_confirmation", model);
}
非常经典的处理访问确认方式 .
现在我知道我必须检查(在此方法的某处)当前经过身份验证的用户(Principal)是否先前已批准访问权限,如果是,我们应该只检索用户关联的令牌,并且可能只是通过redirect_uri向他发送令牌 .
Spring Security中有一个允许令牌检索的内部 endpoints :
@FrameworkEndpoint
@RequestMapping(value = "/oauth/token")
public class TokenEndpoint extends AbstractEndpoint {
@RequestMapping
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal,
@RequestParam(value = "grant_type", required = false) String grantType,
@RequestParam Map<String, String> parameters) {
// the logic here
}
}
如何从我的控制器中调用此框架 endpoints ?它甚至是最好的方式(〜最佳实践?)吗?
提前致谢,
2 回答
您只需在配置中设置 autoAprove=true 即可
您无法使用标准授权类型执行此操作,但我不确定您是否需要 . 您所需要的只是检查用户是否已批准授权并向客户端发送其要求的内容(即授权代码) . 然后正常的拨款继续进行,但没有批准步骤 .
在Spring OAuth的2.0版本中,有一个
ApprovalStore
可以明确地用于这种行为,还有一些实现可以让它很容易让它开箱即用 . 在旧版本中(即使它现在已经很老了,你似乎也在使用它),你必须通过UserApprovalHandler
添加一些自定义,也可能是AuthorizationRequestManager
.