안녕하세요 강사님! 질문있습니다.!
638
작성한 질문수 42
강의 에서는 User 객체에 String roles를 만들고
PrincipalDetailse 객체의 getAuthorities함수에서 밑에 처럼 진행하였는데요
public PrincipalDetails(Customer customer) {
this.customer = customer;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> authorities = new ArrayList<>();
customer.getRoleList().forEach(r -> {
authorities.add(() -> r);
});
return authorities;
}User객체의 Role role 필드를 추가하여
public enum Role {
ROLE_CUSTOMER,ROLE_ADMIN,ROLE_SELLER
}
PrincipalDetailse 객체의 getAuthorities함수 적는방법이 도무지 생각나지 않아 질문드립니다 ㅠ 어떻게 해야할까요.. 도움 구하고싶습니다,
답변 2
1
package com.example.kakao.users;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Converter
public class StringArrayConverter implements AttributeConverter<List<String>, String> {
private static final String SPLIT_CHAR = ",";
@Override
public String convertToDatabaseColumn(List<String> attribute) {
return attribute.stream().map(String::valueOf).collect(Collectors.joining(SPLIT_CHAR));
}
@Override
public List<String> convertToEntityAttribute(String dbData) {
if(dbData == null) { // JPA save는 select부터 하기 때문에, null을 체크해줘야 한다.
return Collections.emptyList();
} else {
return Arrays.stream(dbData.split(SPLIT_CHAR))
.map(String::valueOf)
.collect(Collectors.toList());
}
}
}
package com.example.kakao.users;
import lombok.*;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name="user_tb")
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String email; // 인증시 필요한 필드
private String password;
private String username;
@Convert(converter = StringArrayConverter.class)
private List<String> roles = new ArrayList<>(); // role은 한 개 이상
@Builder
public User(int id, String email, String password, String username, List<String> roles) {
this.id = id;
this.email = email;
this.password = password;
this.username = username;
this.roles = roles;
}
}package com.example.kakao._core.security;
import com.example.kakao.users.User;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.stream.Collectors;
@RequiredArgsConstructor
@Getter
public class CustomUserDetails implements UserDetails {
private final User user;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.user.getRoles().stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getEmail();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
0
public enum Role {
ROLE_CUSTOMER,
ROLE_SELLER;
}//
public class Customer extends BaseTimeEntity {
@Enumerated(EnumType.STRING)
private Role role;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return customer.getRole().toString();
}
});
return authorities;
} @Override
public void signUpCustomer(CustomerSignUpDto customerSignUpDto) throws Exception {
Customer customer = customerSignUpDto.toEntity();
customer.encodePassword(passwordEncoder);
customer.addCustomerAuthority();
if (customerRepository.findByUsername(customer.getUsername()).isPresent()) {
throw new Exception("이미 존재하는 아이디입니다.");
}
customerRepository.save(customer);
} public void addSellerAuthority(){
this.role = Role.ROLE_SELLER;
}답변 매우감사드립니다!!
혹시 이 코드도 제대로 동작하는데 문제없을까요?..
JWT를 구현한 다음 이 API를 호출해서 사용하는 것은 프론트엔드 쪽에서 하는 역할인가요?
0
98
1
Jwt쓰면 스프링시큐리티는 필수적으로 사용해야하나요?
0
401
1
13:23 system.out 출력문이 다르게 나옵니다.
0
131
1
수료증 문의
0
229
2
9분대에 질문이 있습니다 !
0
115
1
password 비교를 하지 않았는데 어떻게 인증이 통과된 건가요?
0
322
1
이전 강의 참고하라는 말씀
0
253
1
강의 실습하다가 막히는 분들 참고(2024년8월 기준)
2
1116
2
구글 소셜 로그인 302
0
201
1
오류 문의 _ org.springframework.orm.jpa.JpaSystemException: could not deserialize
1
585
1
[자바] 시큐리티 Config 참고
13
953
1
이론강의
0
280
1
SpringSecurity JWT 로그인 URL 2개 설정하는 방법
0
488
1
2024.06기준) 최근 SecurityConfig 설정 문의
0
922
3
구글 로그인시 authentication이 null 값이라고 에러가 발생합니다.
0
681
2
특정 url필터 거는 방법 이슈
0
422
1
강사님께서 말씀하시는 시큐리티세션이 SecurityContext인가요?
0
279
1
25강 마지막 테스트에서 오류
1
1044
2
jwt를 저장하는 위치에 궁금한 점이 있습니다.
0
298
1
mustache를 사용하지 않고 thymeleaf를 사용하려고 하는데
0
698
1
세션 인증방식이 REST 원칙에 위배되는 건가요?
0
342
1
jwt와 실제데이터의 관계
1
246
1
jwt 와 세션ID의 관계
1
313
1
SecurityConfig에서 세션 설정, 인가 설정
0
422
1





