首页 > 解决方案 > 是否可以有 2 个 UserDetailsS​​ervice(每个 WebSecurityConfigurerAdapter 一个)?

问题描述

我需要 2 个登录页面,并且都应该从数据库中查找登录信息。按照我的理解,这意味着:

  1. 我需要 2 个扩展 WebSecurityConfigurerAdapter 的类
  2. 由于我需要从数据库(2 个不同的表)中查找信息,我需要 2 个实现 UserDetailsS​​ervice 的类。

我试过这样做,但是当我有两个具有实现 UserDetailsS​​ervice 的类的 Bean 时,看起来两者都没有使用(我还尝试在其中一个安全类中只使用 UserDetailsS​​ervice,并且定义了两个 UserDetailsS​​ervices)。每个类看起来像这样:

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String user) throws UsernameNotFoundException {
      /* ..... */
    }
}

然后我在 WebSecurityConfigurerAdapter 中自动装配:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /* filter */
    }

    @Autowired
    CustomUserDetailsService customUserDetailsService;    
}

(另一个 WebSecurityConfigureAdapter 有 @Order(1) 注释)

标签: javaspringspring-security

解决方案


事实证明,将它添加到安全类有助于:

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

(如果有多个UserDetailsS​​ervice,它似乎无法自动选择同一安全类中的Autowired)


推荐阅读