스프링 부트 시큐리티 사용에서 username 말고 id값을 바로 접근하려면 어떻게 해야하나요? // UserDetails 커스텀, 시큐리티

1,103 views
Skip to first unread message

이동원

unread,
Oct 7, 2019, 8:19:29 AM10/7/19
to Korea Spring User Group Q&A
스프링 부트 시큐리티 사용 중이며

컨트롤러에서 url 매핑 후 메서드(Principal principal)로 principal에서 사용자 고유번호(=id or pk)를 접근하려면
어디를 어떻게 수정해야하나요?

아래 UserDetails를 리턴 시키는데 거기에 id값을 넣을 수 있게 커스텀할 수 있나요?

@Override
public UserDetails loadUserByUsername(String user_id) throws UsernameNotFoundException {

User user = userDAO.findByUser_id(user_id);

if (user == null) {
throw new UsernameNotFoundException(user_id);
}

//afterLogin(user);//마지막 로그인 일시

return org.springframework.security.core.userdetails.User.builder()
.username(user.getUser_id())
.password(user.getUser_pw())
.roles(user.getRole())
.build();

}

이동원

unread,
Oct 7, 2019, 8:32:07 AM10/7/19
to Korea Spring User Group Q&A
추가적으로 저렇게 하려는 이유는 현재 다른 테이블을 조회할때 

1. 회원테이블과 해당테이블을 조인해서 계정조건으로 조회(외래키가 계정 고유번호이기 때문)
2. 회원테이블에서 계정조건으로 조회 후 고유번호 사용하여 해당테이블 조회

이렇게 되지만 바로 고유번호(=id, pk)을 알게된다면 2번할거 1번에 할 수 있다고 생각해서 그렇게 하는게 좋다고 생각되어 질문 올립니다.

정준호

unread,
Oct 7, 2019, 9:09:43 AM10/7/19
to ks...@googlegroups.com
org.springframework.security.core.userdetails.User , org.springframework.security.core.userdetails.UserDetailsService 를 사용하시면 될듯 하네요.
저도 예전에 이런식으로 구현해서 사용했었습니다.

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service(value = "userDetailsServiceImpl")
@Slf4j
public class UserDetailsServiceImpl implements UserDetailsService {

@Autowired
private MemberProvider memberProvider;

@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<Member> member = memberProvider.findMember(username);
if (!member.isPresent()) {
throw new UsernameNotFoundException("사용자 이름 또는 패스워드가 올바르지 않습니다.");
}
member.get().setLastLoginAt(DateUtil.nowLocalDateTime());
memberProvider.saveMember(member.get());
if (!member.get().getMemberStatus().isEnableLogin()) {
log.warn("inActive Member Login =" + member.get().toString());
throw new AuthException("로그인이 불가능한 사용자 입니다.");
}
return new CurrentMember(member.get().getEmail(), member.get().getPassword(),
AuthUtil.toAuthority(member.get().getMemberRoles()), member.get());
}
}


import lombok.Getter;
import lombok.ToString;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Locale;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

@Getter
@ToString
public class CurrentMember extends User {
private Long memberId;
private String email;
private String memberName;
private String memberPhone;
private LocalDate memberBirthDay;
private boolean memberAlarm;
private boolean memberPush;
private MemberStatus memberStatus;
private MemberGradeType memberGrade;
private String memberImageUri;
private String contactEmail;
private LocalDateTime lastLoginAt;
private String memberToken;
private String emailValidToken;
private Locale memberLocale;
private Set<String> memberRoles;
private boolean storeOwner;
private Long storeOwnerId;
private String bankAccountName;
private String bankAccountNumber;
private BankAccountCompanyType bankAccountCompany;
private String companyRegisterNumber;
private String contractUri;
private MemberStatus storeOwnerStatus;

public CurrentMember(String username, String password, Collection<? extends GrantedAuthority> authorities, Member member) {
super(username, password, authorities);
memberId = member.getMemberId();
email = member.getEmail();
memberName = member.getMemberName();
memberPhone = member.getMemberPhone();
memberBirthDay = member.getMemberBirthDay();
memberAlarm = member.isMemberAlarm();
memberPush = member.isMemberPush();
memberStatus = member.getMemberStatus();
memberGrade = member.getMemberGrade();
memberImageUri = member.getMemberImageUri();
contactEmail = member.getContactEmail();
lastLoginAt = member.getLastLoginAt();
memberToken = member.getMemberToken();
emailValidToken = member.getEmailValidToken();
memberLocale = member.getMemberLocale();
memberRoles = CollectionUtil.asStream(authorities)
.map(grantedAuthority -> ((GrantedAuthority) grantedAuthority).getAuthority())
.collect(Collectors.toSet());
storeOwner = false;
if (Objects.nonNull(member.getStoreOwner())) {
storeOwner = true;
storeOwnerId = member.getStoreOwner().getStoreOwnerId();
bankAccountName = member.getStoreOwner().getBankAccountName();
bankAccountNumber = member.getStoreOwner().getBankAccountNumber();
bankAccountCompany = member.getStoreOwner().getBankAccountCompany();
companyRegisterNumber = member.getStoreOwner().getCompanyRegisterNumber();
contractUri = member.getStoreOwner().getKakaoApi();
storeOwnerStatus = member.getStoreOwner().getStoreOwnerStatus();
}
}
}




2019년 10월 7일 (월) 오후 9:32, 이동원 <3cha...@gmail.com>님이 작성:
--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/ad6b366e-00ae-45a4-b51c-88c648debf94%40googlegroups.com을(를) 방문하세요.
Reply all
Reply to author
Forward
0 new messages