Я пытался включить регистрацию пользователей на основе форм в моем проекте.
Просто регистрация пользователя без ролей работает нормально, однако добавление некоторых ролей приводит к ошибке:
com.faster xml .jackson.databind.ex c. InvalidDefinitionException: невозможно создать экземпляр org.springframework.security.core.GrantedAuthority
(создатели, такие как конструкция по умолчанию, не существуют): абстрактные типы либо должны быть сопоставлены с конкретными типами, либо иметь собственный десериализатор, либо содержать дополнительную информацию о типе в [Source: (PushbackInputStream); строка: 9, столбец: 21] (через цепочку ссылок: com.warehousing.model.User ["полномочия"] -> java .util.HashSet [0])
Я подозреваю, что проблема заключается в том, что Spring не знает, как преобразовать мое авторитетное представление во что-то, что расширяет GrantedAuthority
. При этом я попытался переключиться с GrantedAuthority
на SimpleGrantedAuthority
, но проблема осталась.
Мой Пользовательский класс выглядит следующим образом:
public class User implements UserDetails {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String fName;
private String lName;
private String phone;
private String email;
// Properties for Spring authentication
@ElementCollection(targetClass=SimpleGrantedAuthority.class, fetch = FetchType.EAGER)
@JsonDeserialize(as = SimpleGrantedAuthority.class)
private Set<? extends GrantedAuthority> grantedAuthorities;
@NotNull
private String password;
@NotNull
private String username;
private boolean isAccountNonExpired;
private boolean isAccountNonLocked;
private boolean isCredentialsNonExpired;
private boolean isEnabled;
public User(String fName, String lName, String phone, String email,
Set<SimpleGrantedAuthority> grantedAuthorities, String password, String username,
boolean isAccountNonExpired, boolean isAccountNonLocked,
boolean isCredentialsNonExpired, boolean isEnabled) {
this.fName = fName;
this.lName = lName;
this.phone = phone;
this.email = email;
this.grantedAuthorities = grantedAuthorities;
this.password = password;
this.username = username;
this.isAccountNonExpired = isAccountNonExpired;
this.isAccountNonLocked = isAccountNonLocked;
this.isCredentialsNonExpired = isCredentialsNonExpired;
this.isEnabled = isEnabled;
}
// Getters, setters & constructors
}
Мой UserController метод создания нового пользователя:
@RestController
public class UserController {
@Autowired
UserService userService;
@PostMapping("/users")
public User createNew(@Valid @RequestBody User user) {
return userService.addUser(user);
}
}
Который вызывает UserService :
public class UserService implements UserDetailsService {
@Autowired
UserRepository userRepo;
public User addUser(User user) {
Set<SimpleGrantedAuthority> userRoles = user.getGrantedAuthorities()
.stream()
.map(p -> new SimpleGrantedAuthority(p.getAuthority()))
.collect(Collectors.toSet());
User newUser = new User(user.getfName(), user.getlName(),
user.getPhone(), user.getEmail(),
userRoles,
user.getPassword(), user.getUsername(),
user.isAccountNonExpired(),
user.isAccountNonLocked(),
user.isCredentialsNonExpired(),
user.isEnabled());
return userRepo.save(newUser);
}
}
Теперь, отправка JSON выглядит следующим образом:
{
"fName": "First",
"lName": "Last",
"phone": "+3111111111",
"email": "test@mail.com",
"password": "password",
"username": "user",
"enabled": true,
"authorities": [],
"accountNonLocked": true,
"accountNonExpired": true,
"credentialsNonExpired": true
}
Однако добавление некоторого вида власти вызовет ошибку, упомянутую выше:
{
"fName": "First",
"lName": "Last",
"phone": "+3111111111",
"email": "test@mail.com",
"password": "password",
"username": "user",
"enabled": true,
"authorities": [{
"authority": "inventory:read"
}],
"accountNonLocked": true,
"accountNonExpired": true,
"credentialsNonExpired": true
}
Любая помощь приветствуется!