【发布时间】:2016-08-23 13:02:36
【问题描述】:
我在使用 Spring Web 安全性和我的数据库时遇到了一些问题。如果我使用
@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 没有效果。
【问题讨论】:
-
尝试将
Autowired放在configure方法上。还有,你有没有同时使用configureGlobal和configure? -
在 configure 方法上设置 Autowired 与第二种方法相同,注入
AuthenticationManagerBuilder,而不是覆盖 configure。在stackoverflow.com/questions/35218354/… 的回答中建议配置 -
Autowired 可以工作,除了注入顺序的问题,有时
AuthenticationManagerBuilder在dataSource之前注入,但我想知道为什么配置似乎有效,但配置的AuthenticationManagerBuilder是随后未用于身份验证。 -
似乎是小精灵。两种方法都有效。但是,我确实从 Ali 那里了解了多对象注入。谢谢。
标签: spring spring-security configuration