Entity UserInfo и AuthInfo разделяют структуру - PullRequest
0 голосов
/ 28 декабря 2018

Чтобы управлять более чем одним решением для входа в систему, например: имя пользователя / пароль, проверка подлинности 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()));
}

Вот мои вопросы:

  1. Это из-за ленивой загрузки, что первое решение не работает? Я не могу использоватьLocalAuth для получения учетной записи, а затем для получения списка заимствований?

  2. Является ли хорошей идеей разделить информацию для аутентификации пользователя и информацию о пользователе?

  3. Я должен использовать @JsonIgnoreProperties ({"hibernateLazyInitializer", "handler"}), чтобы избежать некоторых обнуляемых ошибок, как я могу решить эту проблему?

Thans.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...