方法 setAuthorities(Set<Role>) 不适用于参数 (Set<String>)

问题描述 投票:0回答:1

如何向用户添加角色?

用户.java

@Entity
@Table(name="users")
@Data
@AllArgsConstructor
public class AppUser {
    
    @Id
    @Column(name ="domainname", unique=true)
    private String domainName;
    
    @Column(name ="username")
    private String userName;
    
    @JsonIgnore
    @Column(name ="password")
    private String  password;
    
    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(
            name="user_role_junction",
            joinColumns = {@JoinColumn(name="domainName")},
            inverseJoinColumns = {@JoinColumn(name="role_id")}
    )
    
    private Set<Role> authorities;
    
    public AppUser() {
        this.authorities = new HashSet<>();
    }
}

角色.java

@Entity
@Table(name="roles")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="role_id")
    private Integer roleId;
    
    private String authority;
    
}

用户控制器.java

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class UserController {

    @Autowired
    private final UserService userService;
    
    @PostMapping("/register")
    public AppUser register (@RequestBody AppUser appUser) {
        if (appUser.getAuthorities() == null) {
            appUser.setAuthorities(Set.of("user"));
        }
        return userService.register(appUser);
    }
    
}

用户服务.java

@Service
@RequiredArgsConstructor
public class UserService {
    
    private final UserRepository userRepository;
    
    public AppUser register(AppUser appUser) {
        return userRepository.save(appUser);
    }

}

用户存储库.java

@Repository
public interface UserRepository extends JpaRepository<AppUser, String> {
}

WebConfig.java

@Configuration
@EnableWebSecurity
public class WebConfig {
    
    @Bean
    public SecurityFilterChain securityFilterChain (HttpSecurity http) throws Exception {
        return http
                    .csrf(csrf -> csrf.disable())
                    .authorizeHttpRequests(auth -> auth
                            .requestMatchers("login", "register").permitAll()
                            .requestMatchers("/admin/**").hasRole("ADMIN")
                            .anyRequest().authenticated()
                     )
                    .logout( logout -> logout.permitAll())
                    .build();
    }
}

我尝试使用“用户”角色设置权限,为创建的新用户添加默认角色。但是,我收到错误:“AppUser 类型中的方法 setAuthorities(Set) 不适用于参数 (Set)”。

spring spring-security roles
1个回答
0
投票

将不在构造函数中的权限设置为新的HashSet,只需将其设置在字段中,如下所示:

private Set<Role> authorities = new HashSet<>();

可能会解决您的问题

© www.soinside.com 2019 - 2024. All rights reserved.