首页 > 解决方案 > Spring Security,PasswordEncoder 的问题

问题描述

我对 PasswordEncoder 有疑问,

我的代码:

@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 结束

我不知道如何解决它。

标签: javaspringspring-security

解决方案


试试这种方式(两个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();
        }



    }

推荐阅读