Java 当您有自定义用户模型时,如何在Spring Boot中设置角色?

Java 当您有自定义用户模型时,如何在Spring Boot中设置角色?,java,spring-boot,spring-security,spring-data-jpa,Java,Spring Boot,Spring Security,Spring Data Jpa,我的目标是在SpringBoot中创建一个自定义用户模型,并将其用于身份验证和授权。它将有自定义字段,但为了尝试,我将使用一个简单的字段 这是我的用户模型(user.java): 我有一个UserController,因此可以注册一个新用户(UserController.java): 这是我的UserDetailsService实现(UserDetailsServiceImpl.java): 在这里我配置了一些东西。。。(WebSecurityConfig.java): 问题是在哪里以及如何向用

我的目标是在SpringBoot中创建一个自定义用户模型,并将其用于身份验证和授权。它将有自定义字段,但为了尝试,我将使用一个简单的字段

这是我的用户模型(user.java):

我有一个UserController,因此可以注册一个新用户(UserController.java):

这是我的UserDetailsService实现(UserDetailsServiceImpl.java):

在这里我配置了一些东西。。。(WebSecurityConfig.java):

问题是在哪里以及如何向用户添加角色? 在UserDetailsServiceImpl中?还是在用户控制器中

我搜索了整个官方文件,但它非常不完整。。。

请记住,
密码
字段(和/或几乎任何其他字段)的请求参数不是一个好主意;请求参数用于其他一些用例。在您的情况下,您希望将所有这些作为
POST
请求正文的一部分发送。您可以在按用户名加载用户时急切地获取关联,也可以定义一个单独的服务来负责获取关联角色。
@Entity
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String username;

    private String password;

    @ManyToMany
    private Set<Role> roles;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isEnabled() {
        // TODO Auto-generated method stub
        return true;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

} 
@Entity
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;
}
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/users")
    public @ResponseBody
    String registerUser(@RequestParam String email,
                      @RequestParam String username,
                      @RequestParam String password) {

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        userService.save(user);

        return "User registered";
    }
}
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = this.userService.findByUsername(username);

        if(user == null) {
            throw new UsernameNotFoundException("User doesn't exists.");
        }

        return user;
    }

}
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public UserDetailsServiceImpl userDetailsServiceImpl() {
        return new UserDetailsServiceImpl();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .httpBasic();
    }
}