gpt4 book ai didi

java - 使用 bcrypt 进行 Spring 身份验证

转载 作者:行者123 更新时间:2023-11-29 05:14:54 25 4
gpt4 key购买 nike

我正在尝试将 bcrypt 添加到我的 spring 应用程序中。没有身份验证就可以正常工作。但是当我尝试使用 bcrypt 进行编码时,我在尝试登录时收到“原因:凭据错误”。

我的用户模型如下所示。

@Entity
@Table(name="users") // user is a reserved word in postgresql
public class User extends BaseEntity {
private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

...
@Column(nullable=false)
private String password;

...

public String getPassword() {
return password;
}
public void setPassword(String password) {
String hashedPassword = passwordEncoder.encode(password);
this.password = hashedPassword;
}

...
}

我的 SecurityConfig 如下所示。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}

private BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
...
}

上面的说法对吗?我是否需要做比我已经完成的更多的事情?

最佳答案

我的错误是没有发布足够的代码。自然地,我的用户模型并没有讲述全部故事。我还有一个名为 SecurityUser 的类,我已在下面发布。由于复制构造函数,密码被散列两次。

public class SecurityUser extends User implements UserDetails {

private static final long serialVersionUID = 867280338717707274L;

public SecurityUser(User user) {
if(user != null)
{
this.setId(user.getId());
this.setName(user.getName());
this.setEmail(user.getEmail());
this.setPassword(user.getPassword());
this.setRoles(user.getRoles());
}
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> authorities = new ArrayList<>();
Set<Role> userRoles = this.getRoles();

if(userRoles != null)
{
for (Role role : userRoles) {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role.getName());
authorities.add(authority);
}
}
return authorities;
}

...
}

我已公开我的 passwordEncoder 方法并将其提升为一个 bean,这样我就可以将它自动连接到我的 UserService 中,如下所示。这样一来,如果我决定这样做,我只需在一个地方更改编码器。

@Service
public class UserService {
@Autowired
private UserRepository userRepository;

@Autowired
private PasswordEncoder passwordEncoder;


public User create(User user) {
String hashedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(hashedPassword);
return userRepository.save(user);
}
...
}

关于java - 使用 bcrypt 进行 Spring 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26951513/

25 4 0
文章推荐: java - JComboBox中如何准确显示字符串?
文章推荐: php - sql注入(inject)登录表单错误
文章推荐: php - 如何在表(MySQL DB)中为一行存储大量数据(超过 3000 行)?
文章推荐: java - 无法从 XPathExpression 转换为 XPathExpression