【问题标题】:Oauth2 Java Config JDBCOauth2 Java 配置 JDBC
【发布时间】:2014-04-06 09:30:35
【问题描述】:

我有一个 oauth2 的工作示例,并为客户端和资源所有者提供内存身份验证和授权。我正在尝试将其转换为 JDBC 身份验证和授权,但没有取得多大成功。我不断收到 Bad Credentials 错误。过滤器的安全性让我很难调试:-)

插入的是我的 java 代码,它现在使用内存身份验证用户,但不用于客户端。架构与this 相同。

是否有使用 jdbc 身份验证和授权的 oauth2.0 的完整工作示例以及某处的 Java 配置

-------------------下面的代码--

public class WebSecurityConfig extends OAuth2ServerConfigurerAdapter {
    private final static Logger logger = LogFactory.getLogger(WebSecurityConfig.class);



    private JdbcClientDetailsService jdbcClientDetailsService;
    private JdbcTokenStore jdbcTokenStore;
    private JdbcUserDetailsManagerConfigurer jdbcUserDetailsManagerConfigurer;
    // @formatter:off
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        OAuth2ServerConfigurer oAuth2ServerConfigurer = new OAuth2ServerConfigurer( ).tokenStore(jdbcTokenStore);
        http
            .requestMatchers()
                .and()
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
            .apply(oAuth2ServerConfigurer);
        http.setSharedObject(ClientDetailsService.class, jdbcClientDetailsService);

    }
    // @formatter:on

//  // @formatter:off
//  @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        int validityInSec = Integer.parseInt(validtityInSeconds);

        auth
                .userDetailsService(new InMemoryUserDetailsManager(getUserDetails()));

    }
    // @formatter:on
//
    private  final Collection<UserDetails> getUserDetails() {
        List<UserDetails> userDetails = new ArrayList<UserDetails>();
        userDetails.add(new User("auction", "password", AuthorityUtils.createAuthorityList(
                "USER", "read", "write")));
        return userDetails;
    }


    @Autowired
    @Qualifier("oauth_details_ds")
    public void setDataSource(DataSource dataSource){
        jdbcClientDetailsService = new JdbcClientDetailsService(dataSource);
        jdbcTokenStore =  new JdbcTokenStore(dataSource);
//        try {
//            jdbcUserDetailsManagerConfigurer = new JdbcUserDetailsManagerConfigurer().dataSource(dataSource);
//        } catch (Exception e) {
//            logger.error("Bad code design: ",e);
//            e.printStackTrace();
//        }
    }



}

【问题讨论】:

  • 为什么不在security.xml 中配置JDBC?该文档显示了如何做到这一点...

标签: java spring-security oauth-2.0


【解决方案1】:

我使用的架构与您在问题中输入的网址相同。我正在使用 postgres,所以我不得不更改一些类型(varchar -> 字符变化,LONGVARBINARY -> bytea)。除此之外,我的数据源设置在一个单独的配置类中,如下所示:

@Bean
public DataSource dataSource() {
    BoneCPDataSource dataSource = new BoneCPDataSource();

    dataSource.setDriverClass("org.postgresql.Driver");
    dataSource.setJdbcUrl("jdbc:postgresql://localhost/oauthDB");
    dataSource.setUsername("my_username");
    dataSource.setPassword("*****");

    return dataSource;
}

我正在使用 Sparklr2 (https://github.com/spring-projects/spring-security-oauth/tree/master/samples/oauth2/sparklr) 中提供的示例,以便我有下一节课:

@Configuration
@EnableWebSecurity
public class OAuth2ServerConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private TokenStore tokenStore;

    private static DataSource dataSource;
    @Autowired
    private void setDataSource(DataSource dataSourcee) {
        dataSource = dataSourcee;
    }

//... SOME MORE CODE ...

@Configuration
@Order(1)
protected static class AuthorizationServerConfiguration extends
        OAuth2AuthorizationServerConfigurerAdapter {

    private TokenStore tokenStore = new JdbcTokenStore(dataSource);

其余代码与 Sparklr2 中的几乎相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2016-05-01
    • 1970-01-01
    • 2014-09-27
    • 2017-03-02
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多