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

Posted

技术标签:

【中文标题】如果用户先前已授权访问,如何绕过 Spring security OAuth2 中的访问确认步骤?【英文标题】:How to bypass access confirmation step in Spring security OAuth2 if user has previously authorized access? 【发布时间】:2015-07-09 23:51:07 【问题描述】:

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

    <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 端点的映射:

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

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

现在我知道我必须检查(在此方法中的某处)当前经过身份验证的用户(委托人)是否先前已批准访问,如果是,我们应该检索与用户相关的令牌,也许只需通过以下方式向他发送令牌redirect_uri

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

    @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
        
    

如何从我的控制器中调用此框架端点?它甚至是最好的方法(~最佳实践?)吗?

提前致谢,

【问题讨论】:

根据@RequestMapping 文档,如果您不传递value 属性,则它是相对于根URL 的,这意味着它可以通过/oauth/token 本身访问 @NikhilTalreja 你不明白我的意思,我需要从我的 AccessConfirmationController 中调用公共 ResponseEntity getAccessToken(...) 方法,但我不知道如何继续。 【参考方案1】:

您只需要在您的配置中设置 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");
    

【讨论】:

很遗憾,它不适用于以前版本的 Spring OAuth (1.0.5-) 没有。这不可能是正确的。设置 autoApprove =true 意味着他们永远不会被提示批准。此 OP 希望批准只发生一次。【参考方案2】:

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

您无法使用标准资助类型来做到这一点,但我不确定您是否需要这样做。您只需要检查用户是否已经批准了授权并向客户发送它所要求的内容(即授权码)。然后进行正常的拨款,但没有批准步骤。

在 Spring OAuth 的 2.0 版中,有一个 ApprovalStore 可以显式地用于这种行为,还有一些实现可以很容易地让它开箱即用。在旧版本中(您似乎正在使用它,即使它现在已经很旧了),您必须通过 UserApprovalHandler 和可能还有 AuthorizationRequestManager 添加一些自定义。

【讨论】:

以上是关于如果用户先前已授权访问,如何绕过 Spring security OAuth2 中的访问确认步骤?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 springfox 在 Swagger UI 中绕过授权

如何使用代码授权流在 Spring 应用程序中提取 Oauth2 访问令牌?

Spring Security---授权操作详解

如果先前的请求未经授权,如何执行快速合并请求

什么可能使已注销的用户能够绕过 Firebase 默认存储规则并访问存储桶?

如何在spring webflux安全中通过绕过选项请求?