当前位置: 首页 > 知识库问答 >
问题:

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

米夕
2023-03-14

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

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

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

这就是我所拥有的:

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

Role.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;
}

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

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

共有1个答案

鲍理
2023-03-14

在您的情况下,您不需要Role类。只需使用List

假设您使用的是Thymeleaf,则可以使用枚举值填充多选下拉列表。

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

 类似资料:
  • 我对在我的应用程序中实施Firebase云消息传递有一些疑问。 我的应用程序类似于whatsapp和facebook messenger。现在,每次有人登录时,我都会注册令牌并将其与用户关联。因此,如果有人想与用户聊天,应用程序会在数据库中搜索用户ID,我在那里找到了他的令牌。 我可以注册设备令牌,但我不确定何时应该注册。 在我的聊天中,用户通过邮件/密码注册进行注册,并且用户可以登录其他设备。

  • 当我使用安全性登录时,无法使用方法。我认为用户的角色没有设定。

  • 新增ISV有两种方式 方式1 启动sop-admin,在admin后台ISV管理添加 方式2 启动sop-website-server,用户访问自主注册

  • 接口说明 注册用户 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /usercenter/api/register/v1.0.0/registerUser 是否需要登录 否 请求字段说明 参数 类型 请求类型 是否必须 说明 loginName string formData 是 用户登录 mobile string formDa

  • 接口说明 注册用户 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 POST /usercenter/api/register/v1.0.0/reg

  • 我正在研究JAVA EE技术,学习JSF-Spring-Hibernate与...我正在尝试使用不同的用户角色做web应用程序。现在,我只有一个用户角色role_user。我不能改变那个角色。我试着调试mod来理解我们是如何设置这个角色的,但我不明白它发生在哪里。 所以,我的主要问题是我不能在我的应用程序中创建任何其他角色。如果我没有在我的流中使用(我使用的是spring web-flow),那么