【问题标题】:Class file for org.springframework.security.authentication.encoding.PasswordEncoder not foundorg.springframework.security.authentication.encoding.PasswordEncoder 的类文件未找到
【发布时间】:2018-07-17 18:25:20
【问题描述】:

我用 Spring-boot 和 spring security 制作了一个简单的 restAPI,实现了基本身份验证。我想使用 inMemoryAuthentication 和 bcryptPasswordEncoder,但由于某种原因,我的编译器在错误的位置寻找 passwordEncoder,请参阅标题与 security.crypto.password.PasswordEncoder。

我的基本身份验证如下所示:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;    
Configuration
    @EnableWebSecurity
    public class BasicAuthConfig extends WebSecurityConfigurerAdapter {
      // Authentication : User --> Roles
      // NoOpPasswordEncoder has been deprecated in Spring security so {noop} is being used to avoid errors
      protected void configure(AuthenticationManagerBuilder auth)
        throws Exception {
        auth.inMemoryAuthentication()
          .passwordEncoder(passwordEncoder())
          .withUser("user1")
            .password("{noop}secret1")
            .roles("USER")
          .and().withUser("admin1")
            .password("{noop}secret1")
            .roles("USER", "ADMIN");
      }

      // Authorization : Role -> Access
      protected void configure(HttpSecurity http) throws Exception {
        http
          .httpBasic()
          .and().authorizeRequests()
            .antMatchers("/tokenservice/**")
              .hasRole("USER")
            .antMatchers("/**")
              .hasRole("ADMIN")
          .and().csrf()
          .disable()
            .headers()
            .frameOptions()
          .and().disable()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
      }
      @Bean
      public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
      }
    }

尝试编译时出现此错误:

Error:(21, 7) java: cannot access org.springframework.security.authentication.encoding.PasswordEncoder org.springframework.security.authentication.encoding.PasswordEncoder 的类文件未找到

忽略密码前面的 {noop}。没有密码编码器可以测试吗?

我对 Spring 和 gradle 以及 java 非常陌生。我可以使用错误版本的 Spring 吗?如果是这样,我该如何解决?

【问题讨论】:

  • 您好!您能在 gradle 设置中向我们展示您的依赖关系吗?
  • 依赖{ compile('org.springframework.boot:spring-boot-starter') compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework :spring-oxm:4.1.5.RELEASE') 编译('org.codehaus.castor:castor-xml:1.3.3') 编译('org.springframework.security:spring-security-web:4.2.3.RELEASE ') 编译('org.springframework.security:spring-security-config:4.2.3.RELEASE') 编译('org.apache.commons:commons-collections4:4.1') testCompile('org.springframework.boot:spring -boot-starter-test')
  • 您的版本似乎不错。检查我的回答,看看它是否能解决您的问题。

标签: spring spring-boot encoding spring-security basic-authentication


【解决方案1】:

如果您使用最新的 spring-security 版本,您应该在 org.springframework.security.crypto.password 包中找到 PasswordEncoder 类。

org.springframework.security.authentication.encoding.PasswordEncoder 包中的PasswordEncoder 已被弃用

【讨论】:

  • 我正在使用 org.springframework.security.crypto.password.PasswordEncoder。或者至少我正在尝试。当我编译时,我得到了错误,因为它正在寻找旧的。
  • 你确定你的代码中没有错误的导入吗?
  • 找不到一个地方我正在导入 org.springframework.security.authentication.encoding.PasswordEncoder =/
  • 并尝试使用 spring-boot-starter-security 而不是 spring 安全依赖项:compile('org.springframework.boot:spring-boot-starter-security')
  • 就是这样,谢谢!它编译!除了现在当我尝试发布到 API 时,我的“编码密码看起来不像 bcrypt”。我是否误解了基本身份验证?这是否意味着我不能使用 bcrypt?它必须是一些标准编码吗
【解决方案2】:

这是由于 spring security config jar 中的版本不匹配。

当您将 spring 版本从 4.x 升级到 5.x 时,会出现此问题,因为 PasswordEncoder 类对象的使用受到限制。

在 AbstractDaoAuthenticationConfigurer 中的 spring-security-config 4.x 版本中,passwordEncoder() 正在重载 org.springframework.security.crypto.password.PasswordEncoder 和 org.springframework.security.authentication.encoding.PasswordEncoder,其他位置spring-security-config 5.x 它只是 org.springframework.security.crypto.password.PasswordEncoder

spring-security-config 4.x

 public C passwordEncoder(org.springframework.security.crypto.password.PasswordEncoder passwordEncoder)
      {
        this.provider.setPasswordEncoder(passwordEncoder);
        return this;
      }

      public C passwordEncoder(org.springframework.security.authentication.encoding.PasswordEncoder passwordEncoder)
      {
        this.provider.setPasswordEncoder(passwordEncoder);
        return this;
      }

spring-security-config 5.x

import org.springframework.security.crypto.password.PasswordEncoder;

  public C passwordEncoder(PasswordEncoder passwordEncoder)
  {
    this.provider.setPasswordEncoder(passwordEncoder);
    return this;
  } 

最有可能的解决方案是将您的 spring 版本降级到 4.x。

【讨论】:

    【解决方案3】:

    看起来这是由 spring-security-config (4.0.2.RELEASE) 和 spring-security-core (5.0.3.RELEASE) 的不兼容版本引起的

    较新版本的spring-security-core 只接受org.springframework.security.crypto.password.PasswordEncoder

    我通过将spring-security-core 降级为匹配spring-security-config 来解决此问题。

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 2018-11-10
      • 2016-10-30
      • 2018-06-10
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多