Чтобы управлять более чем одним решением для входа в систему, например: имя пользователя / пароль, проверка подлинности Facebook и т. Д. Я разделил учетную запись (данные пользователя) и LocalAuth (имя пользователя / пароль) на две таблицы в моем загрузочном проекте Spring.Но теперь мне нужно добавить контроль безопасности для всего моего контроллера, чтобы позволить только самому пользователю получать его информацию.я должен изменить свой API отдыха на этот формат: @GetMapping ("/ {username} / loanings") @PreAuthorize ("authentication.name.equals (#username)") public ... Так что я должен использовать имя пользователя, котороехранится в сущности LocalAuth для получения учетной записи.
Вот таблица пользователя:
@Entity
@Table(name = "account")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Account implements UserDetails, Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDate birthDate;
@Email(message = "The email format is not good")
@Size(max=50)
@Column(nullable = true, length = 50, unique = true)
private String email;
@OneToOne(mappedBy = "account")
private LocalAuth localAuth;
@OneToMany(mappedBy = "borrower", cascade = CascadeType.ALL)
@JsonIgnore
private List<Borrowing> borrowings = new ArrayList<>();
// getter/setter and constructor
}
Таблица аутентификации:
@Entity
public class LocalAuth {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotEmpty(message = "The username can not be empty")
@Size(min=3, max=50)
@Column(nullable = false, length = 50, unique = true)
private String username;
@NotEmpty(message = "The password can not be empty")
@Size(max=100)
private String password;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createDateTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastEditDateTime;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "account_id")
@JsonIgnore
private Account account;
}
В моем AccountService:
public List<Borrowing> getUserBorrowings(String username){
LocalAuth localAuth = localAuthRepository.findByUsername(username);
if(localAuth != null && localAuth.getAccount() != null) {
return localAuth.getAccount().getBorrowings();
}
throw new NotFoundException(username);
}
Новый контроллер:
@GetMapping("/{username}/borrowings")
@PreAuthorize("authentication.name.equals(#username)")
public ResponseEntity<Response> getBorrowings(@PathVariable("username") String username){
List<Borrowing> borrowings = accountService.getUserBorrowings(username);
return ResponseEntity.ok().body(new Response(true, "OK", borrowings, borrowings.size()));
}
Когда я вызвал этот метод, я получил пустой список заимствований
Но когда я использую идентификатор учетной записи, чтобы получить учетную записьи затем получить список заимствований без использования LocalAuth, это работает.Например: "
The original Controller by using accountId:
@GetMapping("/{id}/borrowings")
@PreAuthorize("authentication.name.equals(#username)")
public ResponseEntity<Response> getBorrowings(@PathVariable("id") Long id){
List<Borrowing> borrowings = accountService.getBorrowingsByAccount(id);
return ResponseEntity.ok().body(new Response(true, "OK", borrowings, borrowings.size()));
}
Вот мои вопросы:
Это из-за ленивой загрузки, что первое решение не работает? Я не могу использоватьLocalAuth для получения учетной записи, а затем для получения списка заимствований?
Является ли хорошей идеей разделить информацию для аутентификации пользователя и информацию о пользователе?
Я должен использовать @JsonIgnoreProperties ({"hibernateLazyInitializer", "handler"}), чтобы избежать некоторых обнуляемых ошибок, как я могу решить эту проблему?
Thans.