2016-04-28 227 views
0

我在使用spring web安全和我的數據庫時遇到了一些問題。如果我使用Spring安全配置失敗

@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 
} 

它工作正常,但有時configureGlobalsetDataSource之前打來電話,我得到一個IllegalStateException因爲dataSource在使用前沒有被注入。

我想了解還有什麼需要使第一種方法的工作。

還有什麼辦法來控制@Autowired的順序。將@DependsOn(DataSource)添加到configureGlobal不起作用。

+0

嘗試把一個'Autowired'上'configure'方法。另外,您是否同時使用'configureGlobal'和'configure'? –

+0

將自動裝配置於配置方法將與第二個方法相同,即注入'AuthenticationManagerBuilder',而不是覆蓋配置。配置建議在http://stackoverflow.com/questions/35218354/difference-between-registerglobal-configure-configureglobal-configureglo – dcsalmon

+0

答案建議自動裝配作品除注射順序的問題,其中有時'AuthenticationManagerBuilder'注入之前'dataSource',但我會感興趣的是爲什麼配置似乎能夠工作,但配置的AuthenticationManagerBuilder不會被用於身份驗證。 – dcsalmon

回答

0

使用屬性注入代替Setter注入

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

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

或者直接注入DatasourceconfigureGlobal方法:

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

很酷,謝謝!不知道我可以一次注入兩個物體。 此外,似乎gremlins導致覆蓋方法失敗。重建和該機制似乎也在工作。 – dcsalmon