java - 找不到“org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder”类型的 bean
问题描述
我想通过创建一个简单的登录屏幕在我的项目中使用 Spring Boot Security,但是即使我为 BCryptPasswordEncoder 定义了一个 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的多个类。order
在 WebMvcConfig 类上设置。
@Configuration
@Order(1)
public class WebMvcConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder passwordEncoder() {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
return bCryptPasswordEncoder;
}
}
推荐阅读
- sql - SQL Server - 跳过“假”IF 语句,但仍需要通常的时间?
- react-native - react-native 中的 fetch() 函数抛出“网络请求失败”错误
- linux - dma_mmap_coherent() 映射内存的零拷贝用户空间 TCP 发送
- ajax - 如何在每页加载特定数量的记录并添加更多按钮
- spring - 如何搜索嵌套数组并仅使用 mongo 和 springdata 检索匹配的元素
- python - 使用 Prometheus 的 InfoMetricFamily 在 Grafana 中进行表格可视化
- excel - 如果密码不正确则关闭工作簿
- java - 获取 HTTP 状态 400-Bad Request REST
- python - 跨 ActiveMQ 代理网络负载平衡客户端连接
- javascript - 如何管理应用程序中的两种语言