简体   繁体   English

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

[英]Spring Security how to set roles for user while user registration

currently I'm working on a Spring Boot based web application in Java. 目前,我正在使用Java开发基于Spring Boot的Web应用程序。 I'm trying to create worker registration for my application. 我正在尝试为我的应用程序创建工作人员注册。 To be honest this is my first application like this and I don't really know how to grant user roles while registration. 老实说,这是我的第一个这样的应用程序,我真的不知道如何在注册时授予用户角色。 I've watched a couple of tutorials, but no one shows how to grant roles, while adding new user to database. 我看过一些教程,但是没有人显示如何在向数据库添加新用户的同时授予角色。

In my database I have tables Worker and Role like below. 在我的数据库中,我有如下表Worker和Role。

In registration form I have two checkboxes: worker and admin and I would like to grant permissions depending on which ones have been selected . 在注册表格中,我有两个复选框:worker和admin,我想根据选择的内容授予权限。

This is what I have: 这就是我所拥有的:

Worker.java 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 WorkerRole.java

public enum WorkerRole {
WORKER,ADMIN;}

Role.java Role.java

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

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

//getters and setters

WorkerService.java 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 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;
}

CustomUserDetailsService.java 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();
}

I think that's all, I hope somebody can help me :) 我想仅此而已,我希望有人能帮助我:)

In case of yours, you don't need that Role class. 如果是您的,则不需要该Role类。 Just use List<WorkerRole> roles in Worker.java . 只需在Worker.java使用List<WorkerRole> roles Worker.java Also you can implement UserDetails in Worker.java , instead of using that CustomUserDetails . 您也可以在Worker.java实现UserDetails ,而不是使用该CustomUserDetails

Assuming that you are using Thymeleaf, a multiple selection dropdown can be populated with enum values . 假设您正在使用Thymeleaf, 则可以用枚举值填充多选下拉列表。

After populating dropdown with enum values, you can just select role(s) and create the new user. 在用枚举值填充下拉列表之后,您只需选择角色并创建新用户即可。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM