오늘부터는 본격적인 개발이 시작되었다! 그리고 이제 이 프로젝트의 이름은 '번쩍'이다!
이번 프로젝트의 MVP는 정말 정말 필요한 기능만 가지고 시작할 예정인데, 나는 그 중에서 유저에 관한 내용을 맡았다.
이번 프로젝트에서 처음으로 인증/인가 파트를 맡아보았는데, 이번에 드디어 스프링 시큐리티 커스텀을 진행할 수 있었다!
AuthUser authUser = new AuthUser(userId, email, nickname);
JwtAuthenticationToken authenticationToken = new JwtAuthenticationToken(authUser);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
사실 이 내용은 지난 스프링 플러스 개인 프로젝트의 해설 강의를 통해 배웠던 내용인데, 그 중 일부를 우리에게 맡게 변환하였다.
@Getter
public class AuthUser {
private final Long id;
private final String email;
private final String nickname;
private final Collection<? extends GrantedAuthority> authorities;
public AuthUser(Long id, String email, String nickname) {
this.id = id;
this.email = email;
this.nickname = nickname;
this.authorities = List.of(new SimpleGrantedAuthority("ROLE_USER"));
}
}
이렇게 인증된 유저의 정보를 담을 AuthUser 객체를 만들었다.
원래대로라면 여기에 유저 role의 정보도 따로 저장하고, 각 유저마다 다른 role 정보를 저장해야 하겠지만, 아직까지 우리 서비스에는 권한을 따로 나누지 않았다.
사실 이후 고도화 작업에서 admin 권한을 추가할 예정이지만, 이 부분에 대해서는 나중에 추가하려고 한다.
사실 여기까지의 시큐리티 커스터마이징은 이전에도 진행했었다.
그런데, 이번에는 새롭게 시큐리티의 Authentication 인터페이스에 대한 커스텀 구현체도 생성해보았다.
public class JwtAuthenticationToken extends AbstractAuthenticationToken {
private final AuthUser authUser;
public JwtAuthenticationToken(AuthUser authUser) {
super(authUser.getAuthorities());
this.authUser = authUser;
setAuthenticated(true);
}
@Override
public Object getCredentials() {
return null;
}
@Override
public Object getPrincipal() {
return authUser;
}
}
사실 이것도 해설 강의에서 배운 내용을 가져온 것이지만..
이렇게도 커스터마이징을 할 수 있다는 사실을 배울 수 있었다.
하지만, 아직 스프링 시큐리티의 동작 원리에 대해 제대로 이해하지 못했다.
그래서 배운대로는 커스터마이징을 할 수 있었지만, 내가 어디에 어떤 작업을 진행한 것인지에 대해서는 여전히 이해할 수는 없었다.
급한 작업만 마무리하고, 스프링 시큐리티에 대해서 조금 더 깊이있게 조사해봐야겠다.
우리 팀이 작성한 코드는 깃허브를 통해 업로드해두었다.
GitHub 보러가기
본격적인 기능 개발을 시작하니 너무 너무 재미있어졌다!
오늘은 내가 맡은 유저 관련 기능 구현을 다 마무리했는데, 이제 알림에 대한 기능 구현에 도전해보려고 한다.
당장의 MVP가 끝날 때까지는 빠르게 열심히 잘 해나가야겠다.