2013-07-22 2 views
1

현재 저는 스프링 보안 라이브러리를 사용하고 있으며 다음 질문을 던졌습니다. 데이터베이스 모델과 스프링 보안 테이블을 어떻게 결합해야합니까?스프링 보안 데이터 모델

아시다시피 스프링 보안은 데이터베이스에 인증 관리자를 정의하기 위해 두 개의 테이블 (사용자 및 권한)을 필요로합니다. 내 POV에서 내 추가 사용자 정보를 저장하는 두 가지 가능성 (이메일, LASTNAME, 같은 마지막 로그온, ....)

  1. 내가 인증을위한 일반 사용자 테이블을 가질 수는 지금이 있습니다 목적과 다른 목적을 위해 나머지 하나 (사용자 이름으로 링크 됨)

  2. 필자는 필자의 필요한 속성으로 스프링 보안의 사용자 테이블을 확장한다.

귀하의 관점에서 가장 좋은 디자인은 무엇입니까? 당신의 경험은 무엇입니까?

Lomu

+0

다른 유형의 사용자를 나타내는 파생 클래스를 만들었습니다. 예를 들어'ProfiledUser extends User'. – MaVVamaldo

+0

최대 절전 모드와 ProfiledUser pojo에서 "사용자"pojo를 만들었습니까? –

+0

더 많은 공간이 필요하므로 답을 게시했습니다. – MaVVamaldo

답변

2

나는 봄 보안 라이브러리에 의해 잉태로 사용자 엔티티를 나타내는 POJO User을 생성하고, 둘째로 나는 내 응용 프로그램의 사용자의 특별한 유형을 표시하는 POJO ProfiledUser를 만들었습니다. 프로필에 연결된 사용자가 필요하기 때문에 ProfiledUser라고합니다. 물론, 비슷한 접근법이 당신이 표현할 필요가있는 모든 유형의 사용자에게 적용될 수 있습니다. 기본적으로 하나 이상의 사용자 유형이 필요한 경우 클래스를 만들어 사용자 POJO를 확장 할 수 있습니다. 다음은 JPA 주석이있는 클래스입니다. 당신이 사용자의 한 유형을 표시해야하는 경우

@Entity 
@Table(name="USERS") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class User implements UserDetails { 

    private static final long serialVersionUID = 1L; 
    private long id; 
    private String username; 
    private String password; 
    private boolean enabled = true; 
    Set<Authority> authorities = new HashSet<Authority>(); 
    //...getters & setters 
    } 

@Entity 
@Table(name="PROFILED_USERS") 
public class ProfiledUser extends User{ 

    private static final long serialVersionUID = 1L; 
    //some custom attributes 
    private PersonalData personalData; 
    private ContactData contactData; 
    private AddressData addressData; 
    //...getters & setters 

    } 

, 나는 그것이 User 클래스에 속성을 추가하기 위해 노력한다고 생각합니다. 그러나 Spring Security 프레임 워크에서 정의한 사용자의 추상적 개념을 비즈니스 로직과 분리하는 것을 선호합니다. 따라서 SomethingUser을 구현하고 User 클래스를 확장하는 것이 좋습니다.

0

사람은 사람이므로 사람/사람을 나타내는 클래스/테이블이 있어야합니다.

사용자는 사용자이고 사람과 다릅니다 (그러므로 두 단어가 다릅니다). 사용자를 나타내는 클래스/테이블이 있어야합니다.

사용자 없이도 존재할 수 있습니까? 예

사람 없이도 존재할 수 있습니까? 아니요, 사용자 이름은 누군가의 소유입니다.

@Entity 
abstract class Party { 

    @Id 
    Long id; 

    String name; 

    @OneToMany 
    List<User> usernames = new ArrayList<>(); 
} 

@Entity 
class Individual extends Party { 
    DateTime dateOfBirth; 
} 

@Entity 
class User { 

    @ManyToOne 
    Party party; 

    String username; 

    String password; //you better use BCrypt/Blowfish hashing! 

    Boolean enabled = true; 
} 

파티 당 하나의 사용자 이름 만 사용하려는 경우 대신 @OneToOne 관계를 사용할 수 있습니다.

; 사실 당신은 합법적 인 당사자를 대표하는보다 추상적 인 클래스/테이블을 가져야합니다.