无法找到'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'类型的bean

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法找到'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'类型的bean相关的知识,希望对你有一定的参考价值。

我想通过创建一个简单的登录屏幕在我的项目中使用Spring Boot Security,但即使我为BCryptPassworrdEncoder定义了一个bean,我也会收到这些错误。完整的错误是

com.mahmut.demoemployee.application.dao.Imp.UserDaoImp中的字段bCryptPasswordEncoder需要一个无法找到的类型为'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'的bean。

这是我的代码。

package com.mahmut.demoemployee.application.dao.Imp;
    //Some imports

            @Component
        public class UserDaoImp implements UserDao 

            @Autowired
            UserRepository userRepository;

            @Qualifier("roleRepository")
            @Autowired
            RoleRepository roleRepository;

            @Autowired
            private BCryptPasswordEncoder bCryptPasswordEncoder;

            @Override
            public User save(User user) 
                user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
                user.setActive(1);
                Role userRole = roleRepository.findByRole("ADMIN");
                user.setRoles(new HashSet<Role>(Arrays.asList(userRole)));
                return userRepository.save(user);
            

            @Override
            public User findUserByEmail(String email) 
                return userRepository.findByEmail(email);
            

            @Override
            public List<User> findAll() 
                return (List<User>) userRepository.findAll();
            
        

这是我的配置类。

    package com.mahmut.demoemployee.application.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;


@Configuration
public class WebMvcConfig extends WebSecurityConfigurerAdapter 

    @Bean
    public BCryptPasswordEncoder passwordEncoder() 
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        return bCryptPasswordEncoder;
    


安全配置类

 package com.mahmut.demoemployee.application.config;
//Lots of import here

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    private DataSource dataSource;



    @Value("$spring.queries.users-query")
    private String usersQuery;

    @Value("$spring.queries.roles-query")
    private String rolesQuery;

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception 
        auth.
                jdbcAuthentication()
                .usersByUsernameQuery(usersQuery)
                .authoritiesByUsernameQuery(rolesQuery)
                .dataSource(dataSource)
                .passwordEncoder(bCryptPasswordEncoder);
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 

        http.
                authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/registration").permitAll()
                .antMatchers("/admin/**").hasAuthority("ADMIN").anyRequest()
                .authenticated().and().csrf().disable().formLogin()
                .loginPage("/login").failureUrl("/login?error=true")
                .defaultSuccessUrl("/admin/home")
                .usernameParameter("email")
                .passwordParameter("password")
                .and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/").and().exceptionHandling()
                .accessDeniedPage("/access-denied");
    

    @Override
    public void configure(WebSecurity web) throws Exception 
        web
                .ignoring()
                .antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**");
    


我尝试的是;

我尝试使用PasswordEncoder而不是BCryptPasswordEncoder给出与密码编码器相同的错误。我删除了@Component注释并写了@Service它也给出了相同的错误。我不知道它是否必要,但这里是我的pom.xml文件。只有必要的依赖。

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mahmut</groupId>
    <artifactId>demo-employee</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-employee</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

我不知道我还能做些什么。我检查了很多类似错误的网站并做了但结果是一样的。

答案

您使用了WebSecurityConfigurerAdapter扩展的多个类。在WebMvcConfig类上设置order

@Configuration
@Order(1)
public class WebMvcConfig extends WebSecurityConfigurerAdapter 
    @Bean
    public BCryptPasswordEncoder passwordEncoder() 
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        return bCryptPasswordEncoder;
    

以上是关于无法找到'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'类型的bean的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloudAlibaba项目报错java.lang.IllegalArgumentException: Could not find class [org.springframew解决方案

SpringCloudAlibaba项目报错java.lang.IllegalArgumentException: Could not find class [org.springframew解决方案

解决Cannot find class [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter](代码片

解决Cannot find class [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter](代码片

Spring Boot 引入org.springframework.boot.SpringApplication出错

springboot打包成war,部署到tomcat无法访问的问题