【问题标题】:Spring Security, Problem with PasswordEncoderSpring Security,PasswordEncoder 的问题
【发布时间】:2019-11-24 22:10:20
【问题描述】:

我的密码编码器有问题,

我的代码:

@Service
public class UserService {

    private static final String DEFAULT_ROLE = "ROLE_USER";
    private UserRepository userRepository;
    private UserRoleRepository roleRepository;
    public PasswordEncoder passwordEncoder;


    @Autowired
    public UserService(PasswordEncoder passwordEncoder){
        this.passwordEncoder = passwordEncoder;
    }

    @Autowired
    public void setUserRepository(UserRepository userRepository){
        this.userRepository = userRepository;
    }

    @Autowired
    public void setUserRoleRepository(UserRoleRepository roleRepository){
        this.roleRepository = roleRepository;
    }

    public void addWithDefaultRole(User user){
        UserRole defaultRole = roleRepository.findByRole(DEFAULT_ROLE);
        user.getRoles().add(defaultRole);
        String passwordHash = passwordEncoder.encode(user.getPassword());
        user.setPassword(passwordHash);
        userRepository.save(user);
    }

}

错误:


应用程序启动失败


说明:

org.spring.service.UserService 中构造函数的参数 0 需要一个找不到的 'org.springframework.security.crypto.password.PasswordEncoder' 类型的 bean。

行动:

考虑在你的配置中定义一个 'org.springframework.security.crypto.password.PasswordEncoder' 类型的 bean。

进程以退出代码 1 结束

我不知道如何解决它。

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

    试试这个方法(两个bean之一,不是两个):

        @Configuration
        @EnableWebSecurity
        public class WebSecurityConfigAuthentication extends WebSecurityConfigurerAdapter {
    
            //   For BCrypt Encoded password
    
            @Bean
            public PasswordEncoder passwordEncoder() {
               PasswordEncoder encoder = new BCryptPasswordEncoder();
               return encoder;
            }
    
    
             OR
    
    
            //   For no Encoder, plain text password
    
            @Bean
            public static NoOpPasswordEncoder passwordEncoder() {
               return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
            }
    
    
    
        }
    

    【讨论】:

      【解决方案2】:

      为了使依赖注入起作用,你需要真正声明一个适当类型的bean,否则没有什么可以注入的。正是这告诉你异常。

      @Bean
      public PasswordEncoder passwordEncoder() {
          return new BCryptPasswordEncoder(); // or any other password encoder
      }
      

      【讨论】:

      • 我将您的代码添加到 UserService,但我还有另一个问题
      • 说明:应用上下文中一些bean的依赖形成一个循环:┌─────┐ |文件 [C:\Users\...\UserService.class] 中定义的 userService └──────┘ Process finished with exit code 1
      • 把 bean 放到一个单独的@Component。现在,你想在你的UserService 中注入一个PasswordEncoder,但这正是声明它的组件。
      猜你喜欢
      • 2021-08-30
      • 2013-07-02
      • 2016-11-28
      • 1970-01-01
      • 2013-06-30
      • 2014-05-26
      • 1970-01-01
      • 2020-10-27
      • 2018-09-14
      相关资源
      最近更新 更多