ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링부트+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";
    	}

     

Designed by Tistory.