Сервер авторизации AOuth2 не вставляет токен в данную базу данных - PullRequest
0 голосов
/ 17 декабря 2018

Существует некоторый класс конфигурации на сервере авторизации:

@Configuration
public class AppConfig {

    @Value("${spring.datasource.url}")
    private String datasourceUrl;

    @Value("${spring.database.driverClassName}")
    private String dbDriverClassName;

    @Value("${spring.datasource.username}")
    private String dbUsername;

    @Value("${spring.datasource.password}")
    private String dbPassword;

    @Bean
    public DataSource dataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(dbDriverClassName);
        dataSource.setUrl(datasourceUrl);
        dataSource.setUsername(dbUsername);
        dataSource.setPassword(dbPassword);

        return dataSource;
    }

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

, а другой класс:

@EnableWebSecurity
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private AccountUserDetailsService accountUserDetailsService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new HashingClass();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsServiceBean() throws Exception {
        return accountUserDetailsService;
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/webjars/**", "/resources/**");

    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.requestMatchers()
                .antMatchers("/login", "/oauth/authorize")
                .and()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin().permitAll();
    }

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


}

, а третий класс:

@EnableAuthorizationServer
@Configuration
public class AuthServerOAuth2Config extends AuthorizationServerConfigurerAdapter {

    private final AuthenticationManager authenticationManager;
    private final AppConfig appConfig;

    @Autowired
    public AuthServerOAuth2Config(AuthenticationManager authenticationManager, AppConfig appConfig) {
        this.authenticationManager = authenticationManager;
        this.appConfig = appConfig;
    }

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

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        /*
         * Allow our tokens to be delivered from our token access point as well as for tokens
         * to be validated from this point
         */
        security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");;
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                .authenticationManager(authenticationManager)
                .tokenStore(appConfig.tokenStore()); // Persist the tokens in the database
    }
}

и клиентское приложение выглядит так:

@SpringBootApplication
@EnableOAuth2Sso
@RestController
@Configuration
public class SocialApplication extends WebSecurityConfigurerAdapter {

    @Value("${security.oauth2.client.clientId}")
    private String clientId;

    @Value("${security.oauth2.client.clientSecret}")
    private String clientSecret;

    @Value("${security.oauth2.client.accessTokenUri}")
    private String accessTokenUri;

    @RequestMapping("/user")
    public Principal user(HttpServletResponse response, Principal principal) {
        return principal;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**", "/webjars/**", "/index.html", "/getEmployees.jsp").permitAll()
                .anyRequest().authenticated()
                .and().logout().logoutSuccessUrl("/").permitAll()
                .and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }

    @Bean
    public OAuth2ProtectedResourceDetails oAuth2ProtectedResourceDetails() {
        ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
        details.setClientId(clientId);
        details.setClientSecret(clientSecret);
        details.setAccessTokenUri(accessTokenUri);
        return details;
    }

    public static void main(String[] args) {
        SpringApplication.run(SocialApplication.class, args);
    }
}

, а его файл application.yml:

server:
  port: 8090

security:
  basic:
    enabled: false
  oauth2:
    client:
      clientId: web
      clientSecret: secret
      accessTokenUri: http://localhost:8081/auth/oauth/token
      userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
      authenticationScheme: query
      clientAuthenticationScheme: form
    resource:
      userInfoUri: http://localhost:8081/auth/user

logging:
  level:
    org.springframework.security: DEBUG

Когда я запрашиваю http://localhost:8090/user (этот остаток принадлежит клиенту)Я перенаправлен на сервер авторизации и могу снова успешно войти в систему после входа в систему. Я перенаправлен на клиент с кодом, но клиент не может обменять токен доступа с данным кодом.и в браузере возникает следующее исключение:

Whitelabel Error Page

Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант.Пн. 17 декабря 09:47:27 IRST 2018 Произошла непредвиденная ошибка (тип = Неавторизованный, статус = 401).Ошибка аутентификации: не удалось получить токен доступа

И я запрашиваю из БД:

select * from oauth_access_token

или

select * from oauth_client_token 

Две приведенные выше таблицы пусты.

Где не так?Я действительно запутался.

РЕДАКТИРОВАТЬ

Файл application.properties сервера AOuthrization:

server.port=8081
server.context-path=/auth
security.basic.enabled=false

# ===============================
# = DATA SOURCE
# ===============================

# Set here configurations for the database connection

# Connection url for the database w/createDatabaseIfNotExist=true
spring.datasource.url = jdbc:oracle:thin:@192.168.192.129:1521:hamed
spring.database.driverClassName = oracle.jdbc.OracleDriver
#spring.jpa.database = MySQL
#spring.datasource.platform = mysql

# Database - data initialization
spring.jpa.generate-ddl = true

# Username and password
spring.datasource.username = test
spring.datasource.password = test

# ===============================
# = JPA / HIBERNATE
# ===============================

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager).

# Show or not log for each sql query
spring.jpa.show-sql = true

# Transactions
spring.jpa.open-in-view = false

# Hibernate ddl auto (create, create-drop, update): with "update" the database
# schema will be automatically updated accordingly to java entities found in
# the project
spring.jpa.hibernate.ddl-auto = none

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
# Allows Hibernate to generate SQL optimized for a particular DBMS
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.Oracle12cDialect

и его pom.xml:

<dependencies>

        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>
        <!--<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>r05</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>11.0</version>
        </dependency>
    </dependencies>

и версия пружинной загрузки:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/>
    </parent>

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Я мог бы решить мою проблему, удалив две строки application.yml из клиентского приложения.Эти две строки:

  authenticationScheme: query
  clientAuthenticationScheme: form

Почему эти две строки вызывают проблемы, я не знаю.

0 голосов
/ 19 декабря 2018

Я заметил, что вы используете spring-boot, и мне кажется, что вы можете немного почистить свой код, например, вся эта конфигурация DataSource может не потребоваться.

Что касается вашей проблемы,это может быть связано с классом AuthServerOAuth2Config, где вы вводите AppConfig вместо DataSource и TokenStore, внесение этого изменения может решить вашу проблему.

Здесь вы можете найти пример службы аутентификации Iсделал некоторое время назад https://github.com/marcosbarbero/spring-security-authserver-sample

...