2016-04-28 4 views
0

У меня возникли проблемы с весенней безопасностью и моей базой данных. Если я используюНе удалось создать конфигурацию Spring Security

@Configuration 
@EnableWebSecurity 
public class BBSecurity extends WebSecurityConfigurerAdapter { 
    @Autowired 
    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     JdbcUserDetailsManagerConfigurer<AuthenticationManagerBuilder> cfg = auth.jdbcAuthentication(); 
     cfg.dataSource(dataSource); 
     cfg.usersByUsernameQuery("SELECT user_name, password, true FROM user_data WHERE user_name=?"); 
     cfg.passwordEncoder(new MyPasswordEncoder()); 
     cfg.authoritiesByUsernameQuery("SELECT user_name, concat('ROLE_',role) FROM user_data WHERE user_name=?"); 
    } 
} 

Метод успешно называется, но в журнале я вижу это

Using default security password: 81456c65-b6fc-43ee-be41-3137d02b122b

и мой код базы данных никогда не используется.

Если, вместо этого, я использую (в том же классе)

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
    JdbcUserDetailsManagerConfigurer<AuthenticationManagerBuilder> cfg = auth.jdbcAuthentication(); 
    ... same config code as above 
} 

он отлично работает, но иногда configureGlobal вызывается перед setDataSource и я получаю IllegalStateException потому dataSource не был введен, прежде чем он был использован.

Я хотел бы понять, что еще нужно для того, чтобы первый метод работал.

Также есть ли способ управления порядком @Autowired. Добавление @DependsOn(DataSource) в configureGlobal не влияет.

+0

Попытка поставить 'Autowired' на' configure' метод. Кроме того, вы использовали одновременно «configureGlobal» и «configure»? –

+0

Помещение Autowired на метод configure будет таким же, как и второй метод, инъекцией «AuthenticationManagerBuilder», а не переопределением конфигурации. configure предлагается в ответе на http://stackoverflow.com/questions/35218354/difference-between-registerglobal-configure-configureglobal-configureglo – dcsalmon

+0

Автообновленные работы, за исключением проблемы с порядком впрыска, где иногда «AuthenticationManagerBuilder» вводится до 'dataSource', но мне было бы интересно, почему configure работает, но настроенный' AuthenticationManagerBuilder' впоследствии не используется для аутентификации. – dcsalmon

ответ

0

Используйте поле Injection вместо Setter Injection:

@Configuration 
@EnableWebSecurity 
public class BBSecurity extends WebSecurityConfigurerAdapter { 
    @Autowired private DataSource dataSource; 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     // Same stuff 
    } 
} 

Или впрыскивать Datasource непосредственно к configureGlobal метода:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth, DataSource dataSource) throws Exception { 
    // same stuff 
} 
+1

Прохладный, спасибо! Не знал, что я могу сразу ввести два объекта. Кроме того, появляется, что гремлины вызвали неудачный подход. Восстановлено и этот механизм, похоже, работает. – dcsalmon