首页 > 解决方案 > 如何摆脱为id“null”映射的No PasswordEncoder

问题描述

我参加了一个春季课程,我们正在制作带有登录模块的小预算应用程序。在处理用户登录密码类时,我遇到了 PasswordEncoder 问题。虽然在我看来,在这个阶段不需要密码编码器,但可能是我错了,因为我遵循的课程已经过时了。我遇到了相同的堆栈,但由于它们的编码结构不同而无法理解。如果有人能解释如何摆脱这个错误,感激不尽:

我在 MySql 和数据中也有如下模式:

用户表列用户名、密码值 user1、password123

权限表列权限,user_id 值 ROLE_USER,1

课程如下:

用户.java

@Data
@AllArgConstructor
@Entity
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String password;
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
private Set<Authority>authorities = new HashSet<>();

权限.java

@Data
@AllArgConstructor
@Entity
public class Authority implements GrantedAuthority {

private static final long serialVersionUID = 5919753070016527655L;
@Id
@GeneratedValue
private Long id;
private String authority;

@ManyToOne
private User user;

安全配置.java

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsServiceImpl userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/js/*", "/css/*").permitAll()
            .antMatchers("/**").hasRole("USER").and()
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/budgets")
            .permitAll().and()
            .logout()
                .logoutSuccessUrl("/")
                .permitAll();
}
}

安全用户.java

 public SecurityUser(User user) {
    this.setAuthorities(user.getAuthorities());
    this.setBudgets(user.getBudgets());
    this.setId(user.getId());
    this.setPassword(user.getPassword());
    this.setUsername(user.getUsername());
}

@Override
public Set<Authority> getAuthorities() {
    return super.getAuthorities();
}

@Override
public String getPassword() {
    return super.getPassword();
}

@Override
public String getUsername() {
    return super.getUsername();
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return true;
}
}

UserDetailsS​​erviceImpl.java

@Repository
public class UserDetailsServiceImpl implements UserDetailsService {

@Autowired
private UserRepository userRepo;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    User user = userRepo.findByUsername(username);

    if (user == null)
        throw new UsernameNotFoundException("User does not exist");

    return new SecurityUser(user);
}
}

用户存储库.java

public interface UserRepository extends JpaRepository<User, Long> {
  User findByUsername (String username);
}

标签: spring-boot

解决方案


推荐阅读