【问题标题】:In Spring Security OAuth, how do you use a passwordEncoder for client secrets?在 Spring Security OAuth 中,如何使用 passwordEncoder 获取客户端机密?
【发布时间】:2015-01-07 20:34:32
【问题描述】:

我正在尝试对使用 Spring Security Oauth2 时存储在数据库中的客户端机密进行 BCrypt。我可以看到JdbcClientDetailsService 有一个setPasswordEncoder 方法(如mentioned in this question)。但是,AuthorizationServerConfigurerAdapter 上的 ClientDetailsServiceConfigurer 并没有显示设置密码编码器的任何明显方式。有谁知道如何做到这一点?我已经包含了授权服务器配置:

@Configuration
@EnableAuthorizationServer
public static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private DataSource dataSource;
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    private TokenStore tokenStore;
    @Autowired
    private UserApprovalHandler userApprovalHandler;
    @Autowired
    private ClientDetailsService clientDetailsService;
    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
    }

    @Bean
    public TokenApprovalStore tokenApprovalStore() {
        TokenApprovalStore tokenApprovalStore = new TokenApprovalStore();
        tokenApprovalStore.setTokenStore(tokenStore);
        return tokenApprovalStore;
    }

    @Bean
    public UserApprovalHandler userApprovalHandler() {
        LocalUserApprovalHandler handler = new LocalUserApprovalHandler();
        handler.setApprovalStore(tokenApprovalStore());
        handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientDetailsService));
        handler.setClientDetailsService(clientDetailsService);
        handler.setUseApprovalStore(true);
        return handler;
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.tokenStore(tokenStore)
                .userApprovalHandler(userApprovalHandler)
                .authenticationManager(authenticationManager);
    }


    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
        oauthServer.realm("abcdefgh/client");
    }

}

【问题讨论】:

    标签: spring oauth spring-security spring-security-oauth2


    【解决方案1】:

    从 2.0.5 版开始,passwordEncoder(...) 方法现在可在 ClientDetailsServiceConfigurerAuthorizationServerSecurityConfigurer 上使用,它们在扩展 AuthorizationServerConfigurerAdapter 时可用。在两者上使用相同的PasswordEncoder 实现,配置相对容易。

    【讨论】:

    • 你有代码示例说明如何将它与 ClientDetailsS​​erviceConfigurer 一起使用吗?
    • 关于ClientDetailsServiceConfigurerpasswordEncoder(...)方法实际上是在jdbc(...)方法返回的JdbcClientDetailsServiceBuilder
    【解决方案2】:

    ClientDetailsServiceConfigurer 如果密码已经在数据库中,则实际上不需要对密码进行编码。如果您使用后端存储,您应该将其注入到配置器中,并将在后端创建数据作为单独的问题处理。

    【讨论】:

    • 也许我误解了职责,但我不是在谈论创建bcrypted秘密,我在谈论稍后匹配它们。客户端机密已在数据库中 BCrypted。但是,当客户端显示其机密(基于 SSL 的 HTTP Basic,但未加密 - 正确)时,配置的客户端详细信息服务将需要对相应 PasswordEncoder 的引用来执行 match(...)。否则,这是什么部分?
    • 这不是为什么JdbcClientDetails 有密码编码器的设置器吗?您创建它们并将它们绑定在一起,然后将它们插入 OAuth2 配置器。我现在不看代码,但我很确定这就是它的全部内容(我知道我见过有人使用编码器)。
    • 我找不到任何使用 OAuth2 编码器的人的工作示例,所以如果你有一个我很乐意看到它。我已经尝试创建 JdbcClientDetailsS​​ervice 并在其上设置 PasswordEncoder,但是每当我尝试将其推送到 Builder 中时,它都不起作用。我要么得到空断言,要么它默默地使用默认编码器,因此客户端传入的未加密秘密不起作用。我现在也无法访问我的代码,但是从我所包含的内容来看,您会将编码器、详细信息服务和配置器放在哪里?
    猜你喜欢
    • 2015-12-06
    • 2018-11-15
    • 2020-04-19
    • 2020-04-13
    • 2014-05-26
    • 2019-07-11
    • 2014-07-27
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多