-
스프링부트+JPA - 인스타그램 클론 코딩 04 - 로그인스프링/스프링부트+JPA - 인스타 2021. 9. 23. 19:43
이지업 최주호 강사님 강의 참조
01 로그인을 위한 기본 세팅
- signin.jsp 에 로그인을 위한 form태그 세팅
<form class="login__input" action="/auth/signin" method="POST"> <input type="text" name="username" placeholder="유저네임" required="required" /> <input type="password" name="password" placeholder="비밀번호" required="required" /> <button>로그인</button> </form>
- GET으로 로그인을 처리해버리면 주소창에 GET으로 얻어오는 데이터가 다 노출이된다. 그래서 바디에 내용이 담기도록 POST로 처리해야한다 반드시!!!
- SecurityConfig에서 로그인 처리작업을 마무리 하도록 코드 추가
@EnableWebSecurity @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { .... @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); http.authorizeRequests() .antMatchers("/","/user/**","/image/**","/subscribe/**","/comment/**") .authenticated() //.antMatchers 안의 요청 주소는 인증 요청 .anyRequest().permitAll() .and() // 인증 페이지 요청이면 아래 로긴 페이지로 이동 .formLogin() .loginPage("/auth/signin") //GET일때만 .loginProcessingUrl("/auth/signin") //POST일때만 .defaultSuccessUrl("/"); // 성공하면 "/" 로 이동 } }
- antMatchers에 걸려있는 요청이 오면 인증페이지로 GET으로 받아서 인증 페이지로 넘기고 POST요청시에는 스프링 시큐리티가 받아서 로그인 프로세스를 진행하게됨
- 지금까지 배웠던걸 보면 시큐리티로 로그인을 처리하려면 시큐리티 세션안에 Authentification 객체만 들어가진다는거를 기억할 수 있다. Authentification객체를 만들어보자
@Data public class PrincipalDetails implements UserDetails{ private static final long serialVersionUID = 1L; private User user; public PrincipalDetails(User user) { this.user = user; } @Override public Collection<? extends GrantedAuthority> getAuthorities() { Collection<GrantedAuthority> collector = new ArrayList<GrantedAuthority>(); collector.add(()->{return user.getRole();}); return collector; } @Override public String getPassword() { return user.getPassword(); } @Override public String getUsername() { return user.getUsername(); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }
@RequiredArgsConstructor @Service public class PrincipalDedetailsService implements UserDetailsService{ private final UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User userEntity = userRepository.findByUsername(username); if (userEntity==null) { return null; } else { return new PrincipalDetails(userEntity); } } }
- UserRepository가 들고있지않는 기능을 직접 만들어 주자
public interface UserRepository extends JpaRepository<User, Integer>{ User findByUsername(String username); }
→ 테스트
굿! 더보기403 에러 - 접근 금지
404 에러 - 표시할 페이지 없음 (즉 여기서는 로그인은 정상 진행 됬지만 페이지가 없음)
02 정상 로그인 후 각 버튼 페이징
- 각 버튼을 클릭해보면 주소가 어디로 연결되는지 나온다. 거기에 맞춰서 컨트롤러를 배분하자
1) 홈 페이징
@Controller public class ImageController { @GetMapping({"/","/image/story"}) public String story() { return "image/story"; } }
굿! 2) 가운데 버튼 페이징
@GetMapping("/image/popular") public String popular() { return "image/popular"; }
굿! 3) 세번째 버튼 페이징
@Controller public class UserController { @GetMapping("/user/{id}") public String profile(@PathVariable int id) { return "user/profile"; } }
굿! - 유저 페이징은 매개변수로 아이디값을 넘겨받아 아이디값에 맞는 유저 페이지를 열도록 세팅!
- 사진등록 / 회원정보변경 (설정 옵션 클릭 후)
@Controller public class ImageController { ... @GetMapping("/image/upload") public String upload() { return "image/upload"; }
@Controller public class UserController { ... @GetMapping("/user/{id}/update") public String update(@PathVariable int id) { return "user/update"; }
- 현재 id값을 받지만 간단 컨트롤러 테스트이기때문에 1로 설정해서 테스트 했다. 나중에 완전히 세팅 할 예정
※ 로그인이되서 페이징을 볼 수 있다는 것은 세션이 유효하다는 것이다. 이 세션값을 체크해보자
@GetMapping("/user/{id}/update") public String update(@PathVariable int id, @AuthenticationPrincipal PrincipalDetails principalDetails) { System.out.println("세션: "+principalDetails.getUser()); return "user/update"; }
'스프링 > 스프링부트+JPA - 인스타' 카테고리의 다른 글
스프링부트+JPA - 인스타그램 클론 코딩 06 - 구독API(연관관계 개념) (0) 2021.09.24 스프링부트+JPA - 인스타그램 클론 코딩 05 - 회원정보수정 (0) 2021.09.23 스프링부트+JPA - 인스타그램 클론 코딩 03 - 2 AOP/회원가입 마무리 (0) 2021.09.23 스프링부트+JPA - 인스타그램 클론 코딩 03 - 1 시큐리티 및 회원가입 (0) 2021.09.17 스프링부트+JPA - 인스타그램 클론 코딩 02-1 - 프로젝트 기본 세팅 및 기본 개념 이해 (0) 2021.09.17