1

ID로 사용자 가져 오기, 사용자 추가, 사용자 제거, 사용자 목록 표시 등과 같은 표준 작업을 제공하는 REST 서비스를 만들고 있습니다.이 프로젝트에 Google Cloud Endpoints를 사용하고 있습니다.휴식 API를위한 사용자 리소스를 모델링하는 가장 좋은 방법

내 현재 모델에는 DisplayableUser에서 파생 된 User이라는 클래스가 사용됩니다. User에는 비밀번호와 같은 민감한 정보가 포함되어 있으며 DisplayableUser에는 클라이언트에게 안전하게 전달할 수있는 입력란 만 포함되어 있습니다. 사용자를 위해 JSON 표현을 제공해야 할 때마다 간단히 UserDisplayableUser으로 캐스팅 한 다음 직렬화하여 클라이언트로 전달합니다.

제 질문은 이것이 올바른 방법입니까? 내가 전에 시도한 접근 방식은 다음과 같습니다.

Password이라는 별도 클래스를 도입하십시오. 이 클래스에는 User (현재 중요한 데이터가 들어 있지 않음) 및 실제 해시 된 비밀번호에 대한 참조가 포함되어 있습니다. 나는 objectastore BTW와 상호 작용하기 위해 objectify를 사용하고 있습니다.

@Entity 
public class Password 
{ 
    @Id 
    Long id; 
    @Load 
    Ref<User> user; 
    String passwordHash; 

    ..... 
} 

내가 스토어에서 User를 검색하면 내가 여기에 직면하고 문제, 어떻게 대응 Password 개체를 검색 할 수 있습니까?

+0

질문을 이해할 수 없습니다. 보안상의 이유로 암호를 데이터베이스에 저장하지 않습니다. 나는 오직 해시만을 저장한다. 거기에없는 것을 얻을 수는 없습니다 ... – inf3rno

답변

1

해결책 1 referenceproperty를 사용하는 대신 암호를 사용자의 하위로 설정하는 것이 어떻습니까? 당신은 사용자가 한 번 그와 마찬가지로, 당신은 쉽게

P = Password.query 같은과 암호를 검색 할 수 있습니다 (Password.ancestorKey == 용할 user_ID) .fetch()

이있다 귀하의 질의를 일관성있게 유지하는 보너스입니다. 암호를 쿼리 할 때 사용자가 잠겨 있다는 사실은 문제가되지 않아야합니다 (물론 사용 사례에 따라 다름).

해결 방법 2 "해시 된 암호"와 "user_id"만 매개 변수로 사용하여 암호를 만드는 것입니다.

해결책 3 개인적으로 표시 가능한 사용자를 덤프하고 사용자 만 사용합니다. "안전"정보를 쿼리 할 때는 projection query을 사용하여 원하는 필드를 확인하십시오.

+0

첫 번째 해결 방안에 대해, 일단 사용자가 있으면 모든 암호를 검색하는 것이 성능상의 문제가되지 않습니까? – iTwenty

+0

@iTwenty, 이것은 대부분 당신에게 그것을 보여주기위한 것이 었습니다. 언제든지 p = Password.query (Password.ancestorKey == user_ID) .fetch() (답변에 편집 됨) – Patrice

+0

Ok. Datastore에 아직 익숙하지 않아 쿼리 할 수있는 모든 방법이 확실하지 않습니다. 도와 주셔서 감사합니다! – iTwenty

1

데이터 모델과 데이터 전송 (또는 디스플레이) 모델간에 불일치가있을 때마다 별도의 수업. 클라이언트 측의 데이터 모델 클래스 공유는 간단한 경우에 편리 할 수 ​​있지만 올바른 데이터를 얻기 위해 왜곡을 시작하자마자 DTO를 만드는 것이 더 쉽습니다. 상용구를 없애기 위해 projectlombok.org를 사용하면 DTO가 초경량이됩니다.

+0

나는 지금 별도의 수업을 가지고있다. 클라이언트 표시 가능 User 클래스는 암호가있는 User 클래스의 상위 클래스로 작동합니다. 상속을 제거하고 두 개의 완전히 다른 클래스를 가짐을 의미합니까? – iTwenty

+0

예, 이와 같은 상속 구조는 100 % 별도 DTO를 만드는 것이 도움이 될 것이라고 생각하게 만듭니다. 나에게 매우 이상한 외모는 패스워드를 별도의 엔티티로 갖는 것입니다. 하지만 궁극적으로 이것은 당신의 코드베이스입니다. – stickfigure

관련 문제