【问题标题】:Spring Boot JWT - Adding BCrypt Security - Getting Access DeniedSpring Boot JWT - 添加 BCrypt 安全性 - 拒绝访问
【发布时间】:2020-08-07 11:20:31
【问题描述】:

我有一个应用服务器,它使用带有 JWT 令牌的 Spring 引导框架。我想加密用户密码,但遇到登录问题。我可以使用加密用户的密码 userModel.setPassword(new BCryptPasswordEncoder().encode(userModel.getPassword())); 但是当我尝试登录时,我得到了Encoded password does not look like BCrypt。我尝试更改身份验证方法并加密登录密码,但没有成功。

       new UsernamePasswordAuthenticationToken(
        authenticationRequest.getUsername(),
        new BCryptPasswordEncoder().encode( authenticationRequest.getPassword())));

如果您能指出直接的方向或给我解决方案,我将不胜感激。下面是我的安全配置文件。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final MyUserDetailService myUserDetailService;
    private final JwtRequestFilter jwtRequestFilter;

    public SecurityConfig(MyUserDetailService myUserDetailService, JwtRequestFilter jwtRequestFilter) {
        this.myUserDetailService = myUserDetailService;
        this.jwtRequestFilter = jwtRequestFilter;
    }

    @Override
    // Authentication : User --> Roles
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {

        auth.authenticationProvider(authProvider());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public DaoAuthenticationProvider authProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(myUserDetailService);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    @Override
    // Authorization : Role -> Access
    protected void configure(HttpSecurity http) throws Exception {

        http
                .csrf().disable()
                .formLogin().disable()
                .headers().frameOptions().disable()
                .and()
                .authorizeRequests()
                .antMatchers("/authenticate").permitAll()                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
        return source;
    }
}

我无法使用加密密码或原始密码进行身份验证(登录)。请让我知道我可以做些什么来解决。

感谢您的帮助。

【问题讨论】:

    标签: spring-boot spring-security jwt bcrypt


    【解决方案1】:

    嘿,我和你有同样的问题,我刚刚解决它。

    new UsernamePasswordAuthenticationToken(
      authenticationRequest.getUsername(), 
      authenticationRequest.getPassword())
    );
    

    用我的代码替换你的那部分代码。 通过再次调用new BCryptPasswordEncoder().encode,您将创建另一个盐值,这与之前在数据库中保存用户时创建的盐值不同。 通过登录,您将永远不会获得与数据库中相同的值。

    【讨论】:

      【解决方案2】:

      如果数据库中存储的密码未正确加密,则会引发异常。

      确保它以 $2a$$2b$$2y$ 开头,并且长度正好为 60 个字符。

      【讨论】:

      • 保存正确,2a开头,60个字符$2a$10$D2UAhxPnAr80LamfQTrfJO08JtTSY6/HXzEsAtZBH1nvEHPnjQw6.
      • 奇怪,我用正则表达式检查了它,但它可以工作。这是代码中记录警告的行:github.com/spring-projects/spring-security/blob/… 我检查了整个 spring-security-core 项目,这是唯一的地方。
      • 你发布的密码是从数据库还是从调试?可能你的数据库列太短了,所以只保存了一部分。
      • 另一个想法是,用户服务找不到用户。那么密码将为空并且与正则表达式不匹配。您可以调试并验证用户对象不为空吗? (用户名错误,...)
      • 我检查了数据库和正则表达式。我决定自己散列而不是 BCrypt
      猜你喜欢
      • 2019-09-23
      • 1970-01-01
      • 2020-06-13
      • 2023-03-21
      • 2021-07-14
      • 1970-01-01
      • 2020-12-19
      • 2023-04-04
      • 2020-02-29
      相关资源
      最近更新 更多