配置含自定义用户与密码编码器的Spring Security时遇错误
解决Spring Security配置中的方法未定义错误
原配置代码
@Configuration public class SpringSecurityConfiguration { //InMemoryUserDetailsManager(UserDetails... users) @Bean public InMemoryUserDetailsManager createUserDetailsManager() { Function<String, String> passwordEncoder = input -> passwordEncoder().encode(input); UserDetails userDetails = User.builder() .passwordEncoder(passwordEncoder) .username("abc") .password("123") .roles("USER","ADMIN") .build(); return InMemoryUserDetailsManager(userDetails); } @Bean public PasswordEncoder passwordEncoder() { return BCryptPasswordEncoder(); } }
报错信息
Error:The method InMemoryUserDetailsManager(UserDetails) is undefined for the type SpringSecurityConfiguration Error:The method BCryptPasswordEncoder() is undefined for the type SpringSecurityConfiguration
错误原因与修复步骤
这两个错误的核心是把类当成当前类的方法调用了,正确做法是用new关键字实例化对应类,同时要确保导入了正确的Spring Security依赖包:
修复InMemoryUserDetailsManager实例化
原代码中直接写InMemoryUserDetailsManager(userDetails)是错误的,这是类的构造方法,需要用new创建实例,改为:return new InMemoryUserDetailsManager(userDetails);修复BCryptPasswordEncoder实例化
同理,BCryptPasswordEncoder()是类的构造方法,需要添加new关键字,改为:return new BCryptPasswordEncoder();补充必要的导入语句
在类的顶部添加以下导入,确保所有用到的类都能被识别:import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import java.util.function.Function;
修复后的完整代码
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import java.util.function.Function; @Configuration public class SpringSecurityConfiguration { @Bean public InMemoryUserDetailsManager createUserDetailsManager() { Function<String, String> passwordEncoder = input -> passwordEncoder().encode(input); UserDetails userDetails = User.builder() .passwordEncoder(passwordEncoder) .username("abc") .password("123") .roles("USER","ADMIN") .build(); return new InMemoryUserDetailsManager(userDetails); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
内容的提问来源于stack exchange,提问作者Lamda Function
相关产品推荐
相关产品推荐

