gpt4 book ai didi

java - Spring Security如何在用户注册时为用户设置角色

转载 作者:行者123 更新时间:2023-12-02 11:45:33 25 4
gpt4 key购买 nike

目前我正在使用 Java 开发基于 Spring Boot 的 Web 应用程序。我正在尝试为我的应用程序创建 worker 注册。老实说,这是我的第一个这样的应用程序,我真的不知道如何在注册时授予用户角色。我看过几个教程,但没有人展示如何在向数据库添加新用户时授予角色。

在我的数据库中,我有如下表 Worker 和 Role。

在注册表中,我有两个复选框: worker 和管理员,我想根据所选的复选框授予权限。

这就是我所拥有的:

Worker.java

@Id
@Column(name = "workerId")
@GeneratedValue(
strategy= GenerationType.AUTO,
generator="native"
)
@GenericGenerator(
name = "native",
strategy = "native"
)
private int workerId;

@Column(name = "login")
@NotEmpty
private String username;

@Column(name = "password")
@NotEmpty
private String password;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "workerId", fetch = FetchType.EAGER, orphanRemoval = true)
private Set<Role> roles;

WorkerRole.java

public enum WorkerRole {
WORKER,ADMIN;}

角色.java

@NotNull
@ManyToOne
@JoinColumn(name = "workerId")
private Worker workerId;

@Id
@Column(name = "role")
private String role;

//getters and setters

WorkerService.java

@PersistenceContext
EntityManager entityManager;

@Autowired
private WorkerRepository workerRepository;

@Autowired
public WorkerService(WorkerRepository workerRepository){
this.workerRepository = workerRepository;
}

public Worker findByEmail(String email){
return workerRepository.findByEmail(email);
}

public Optional<Worker> findByUsername(String username)
{
return workerRepository.findByUsername(username);
}

public Worker findByConfirmationToken(String confirmationToken){
return workerRepository.findByConfirmationToken(confirmationToken);
}

public void saveUser(Worker worker){
workerRepository.save(worker);
}

public PasswordEncoder getPasswordEncoder() {
return new PasswordEncoder() {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}

@Override
public boolean matches(CharSequence charSequence, String s) {
return true;
}
};
}

public Worker findByUname(String login){
Worker worker = null;
try{
worker = entityManager.createQuery("select w from Worker w " +
"where w.login = :login ", Worker.class)
.setParameter("login", login)
.getSingleResult();
}catch (Exception e){
System.out.println("No results found for that uname");
}

return worker;
}

CustomUserDetails.java

public CustomUserDetails(final Worker worker) {
super(worker);
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {

return getRoles()
.stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRole()))
.collect(Collectors.toList());
}

@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;
}

CustomUserDetailsS​​ervice.java

@Autowired
private WorkerRepository workerRepository;


@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<Worker> optionalUsers = workerRepository.findByUsername(username);

optionalUsers
.orElseThrow(() -> new UsernameNotFoundException("Worker not found"));
return optionalUsers
.map(CustomUserDetails::new)
.get();
}

我想就这些了,我希望有人能帮助我:)

最佳答案

对于你的情况,你不需要 Role类(class)。只需使用 List<WorkerRole> rolesWorker.java 。您也可以实现 UserDetailsWorker.java ,而不是使用 CustomUserDetails .

假设您使用的是 Thymeleaf,多选下拉菜单 can be populated with enum values

使用枚举值填充下拉列表后,您只需选择角色并创建新用户。

关于java - Spring Security如何在用户注册时为用户设置角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48231685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com