11. 시큐리티(1) 유저 만들기

Alex·2024년 6월 22일
0

이슈 트래커

목록 보기
19/21

(지금부터 작성할 시큐리티 코드는 스프링 인 액션 second edition을 보고 작성한 것이다. 국내에서는 아직 번역이 안돼서 원서를 참고했다. 1st 에디션을 이미 3년전 쯤에 나온 책이라서 업데이트가 안 된 내용이 많아서 2nd 에디션을 보기로 했다.)

@Configuration
public class SpringSecurityConfig {

    @Bean
    public UserDetailsService userDetailsService(){
        UserDetails user1 = User
                .withUsername("jeong")
                .password("123")
                .authorities("read")
                .build();

        return new InMemoryUserDetailsManager(user1);
    }
}

//이 방식은 아직 user 도메인을 완성하지 않았을 때 mock 객체처럼 쓸 수 있는 방식이다.

여기서 UserDetailsService는 username을 통해서 user을 반환하는 역할을 한다. 이를 통해서 좀더 복잡한 기능을 구현하려면 UserDetailsManager가 필요하다.

이 두가지를 분리한 건 관심사의 분리 때문이라고 한다. 굳이 필요하지 않은 인터페이스는 사용하지 않게끔 해주기 위해서인 것.

참고로 스프링 시큐리티가 이해하는 User를 만들려면 UserDetail라는 라는 계약을 준수해야 한다.

그렇다면, 도메인 user 클래스가 UserDetail라는 인터페이스를 구현하게 해야 하는데, 이러면 책임이 복잡하게 엉킨다.

책에서는 도메인과 시큐리티를 위한 user를 각각 분리할 것을 권하고 있다.

@Entity
@NoArgsConstructor
@Getter
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long id;
    private String loginId;
    private String name;
    private String password;
    private String address;
    private LocalDate birthdate;
    private String authority;
    
    중략
    
    }
    
    
@RequiredArgsConstructor
public class SecurityUser implements UserDetails {

    private final User user;


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(()->user.getAuthority());
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getName();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
    
    

이제 user를 추가하고, 삭제하는 등의 관리가 필요하다.

그 역할은 UserDetailsManger가 한다. 앞서 사용했던 InMemoryUserDetailsManager 클래슨ㄴ UserDetailsManger의 구현체다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글