【问题标题】:Spring Security Configuration FailsSpring Security 配置失败
【发布时间】: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
 }

它工作正常,但有时configureGlobalsetDataSource 之前被调用,我得到一个IllegalStateException,因为dataSource 在使用之前没有被注入。

我想了解使第一种方法起作用还需要什么。

还有什么方法可以控制@Autowired的顺序。将@DependsOn(DataSource) 添加到configureGlobal 没有效果。

【问题讨论】:

  • 尝试将Autowired 放在configure 方法上。还有,你有没有同时使用configureGlobalconfigure
  • 在 configure 方法上设置 Autowired 与第二种方法相同,注入 AuthenticationManagerBuilder,而不是覆盖 configure。在stackoverflow.com/questions/35218354/… 的回答中建议配置
  • Autowired 可以工作,除了注入顺序的问题,有时AuthenticationManagerBuilderdataSource 之前注入,但我想知道为什么配置似乎有效,但配置的AuthenticationManagerBuilder 是随后未用于身份验证。
  • 似乎是小精灵。两种方法都有效。但是,我确实从 Ali 那里了解了多对象注入。谢谢。

标签: spring spring-security configuration


【解决方案1】:

使用字段注入代替Setter注入

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

【讨论】:

  • 酷,谢谢!不知道我可以一次注入两个对象。此外,似乎 gremlins 导致覆盖方法失败。重建后,该机制似乎也可以正常工作。
猜你喜欢
  • 2016-08-12
  • 2012-01-23
  • 2011-01-08
  • 2016-01-10
  • 2020-03-22
  • 2020-03-04
  • 2017-10-18
  • 2017-07-17
相关资源
最近更新 更多