如果用户先前已授权访问,如何绕过Spring安全OAuth2中的访问确认步骤?

时间:2015-04-30 10:12:52

标签: spring spring-mvc spring-security spring-security-oauth2

我目前正试图绕过Spring Security OAuth2中访问授权进程的批准/拒绝步骤,因为应该记住先前授权的访问权限(针对特定的client_id和user_id)并允许OAuth -app被重定向到客户端应用程序,而不是每次都要求用户批准。

verify

所以我有一个AccessConfirmationController,它有/ oauth / confirm_access端点的映射:

    <version.spring-security>3.2.0.RELEASE</version.spring-security>
    <version.spring-security-oauth>1.0.5.RELEASE</version.spring-security-oauth>

处理访问确认的非常经典的方式。

现在我知道我必须检查(在此方法的某处)当前经过身份验证的用户(Principal)是否先前已批准访问权限,如果是,我们应该只检索用户关联的令牌,并且可能只是通过 redirect_uri

Spring Security中有一个允许令牌检索的内部端点:

    @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);
    }

如何在控制器内调用此框架端点?这甚至是最好的方式(〜最佳实践?)吗?

提前感谢,

2 个答案:

答案 0 :(得分:9)

您只需在配置

中设置 autoAprove = true 即可
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("my-client")
                        .secret("secret")
                        .authorizedGrantTypes("authorization_code")
                        .autoApprove(true)
                .scopes("scope");
    }
}

答案 1 :(得分:3)

  

也许只需通过redirect_uri向他发送令牌。

您不能使用标准授权类型,但我不确定您是否需要。您所需要的只是检查用户是否已批准授权并向客户端发送其要求的内容(即授权代码)。然后正常的拨款继续进行,但没有批准步骤。

在Spring OAuth的2.0版本中,有一个ApprovalStore可以明确用于此类行为,还有一些实现可以让它轻松实现开箱即用。在较旧的版本中(即使它现在已经很老了,您似乎也在使用它),您必须通过UserApprovalHandler添加一些自定义设置,还可能添加AuthorizationRequestManager