首页 > 解决方案 > Spring Security - Oauth 实现

问题描述

我正在尝试实现与 oauth2 类似的授权服务,只是它不需要用户名和密码来生成密钥和刷新令牌。但从我发现的情况来看,你必须给它一个用户和一个密码。有什么解决方法吗?

我的代码是:

@Configuration
public class AuthorizationServerConfiguration implements AuthorizationServerConfigurer {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.checkTokenAccess("isAuthenticated()").tokenKeyAccess("permitAll()");
    }

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

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

}


@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;


    @Bean
    public AuthenticationManager getAuthenticationManager() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
}

标签: springspring-security

解决方案


根据您的要求,您可以使用 JWT 令牌。它支持各种算法,如RS256HS256

我会HS256作为参考。

在您的授权服务器中,您需要根据一些 Secret 密钥生成 Token。在客户端。您需要使用相同的密钥验证令牌。

如果您不想在授权服务器和客户端服务器之间共享密钥

您可以使用RS256具有公钥和私钥概念的哪个。

为了实现,您需要Filter为每个调用添加一个检查 Header 中的 Token 。

有关实现的更多详细信息,请参阅这篇文章。


推荐阅读