Search

26. 스프링부트 포토그램 인증 로그인 UserDetailsService 이해하기

포토그램 인증 구현하기

로그인구현

db에 쌀 유저에 대한 데이터 1개만 있도록 만들고
로그인화면하고 관련있는 signin.jsp 에서 로그인폼에
action 하고 method를 추가해주자.
<!--로그인 인풋--> <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> <!--로그인 인풋end-->
Java
복사
잠깐!
POST는 INSERT할 때 쓰는건데 지금 로그인은 INSERT 하는게 아니라 데이터베이스에 유저네임하고 패스워드가 있는지를 SELECT해서 확인하는게 아닌가??
SELECT 할때 GET을 쓰는게 맞지만 로그인할때는 POST를 써야한다.
username하고 password는 귀중한 정보이고 주소창에 노출시키면 안된다.
데이터를 body에 담고 갈려면 POST방식 밖에 없다.
그래서 예외적으로 로그인만 POST방식!
/auth/siginin에 대한거를 우리가 컨트롤러로 만들어서 우리가 제어하는게 아니라 스프링 시큐리티에 위임해줘야한다.
회원가입때는 우리가 컨트롤러를 만들었지만 로그인때는 우리가 만들지 않을거다.
SecurityConfig.java에서 기존의 configure함수에다가
.loginProcessingUrl("/auth/signin") //POST -> 스프링 시큐리티가 로그인 프로세스 진행
Java
복사
추가해주자
기존에 추가되어있던거는
어떤 인증이 필요한 페이지로 요청하면 GET방식으로 요청할때 사용.
.loginPage("/auth/signin") //접근 권한이 없는 페이지(위에 설정한 주소)들은 다 이 주소로 이동. //GET
Java
복사
@Override protected void configure(HttpSecurity http) throws Exception { //super 삭제 - 기존 시큐리티가 가지고 있는 기능이 다 비활성화됨. http.csrf().disable(); //CSRF토큰을 비활성화 http.authorizeRequests() .antMatchers("/", "/user/**", "/image/**", "/subscribe/**" , "/comment/**").authenticated() // / , /user , /image, /subscribe, /comment로 시작하는 주소로 들어오면 인증필요 .anyRequest().permitAll() // 그게 아닌 모든 요청은 허용 하겠다. .and() .formLogin() //form태그 및 input태그 중에 form태그로 로그인할 .loginPage("/auth/signin") //접근 권한이 없는 페이지(위에 설정한 주소)들은 다 이 주소로 이동. //GET .loginProcessingUrl("/auth/signin") //POST -> 스프링 시큐리티가 로그인 프로세스 진행 .defaultSuccessUrl("/"); //로그인을 정상처리하면 /로 이동 }
Java
복사
추가적으로 만들어줘야하는 파일이 2개가 있다.
config 폴더안에 auth 패키지 생성. auth 폴더안에 PrincipalDetailsService.java 생성
UserDetailsService를 implements해주면 인터페이스니까
빨간줄에 마우스 갖대되서 Add unimplemented methods 눌러주기
그리고 @Service 추가해줘서 IoC에 등록해주자.
이 파일이 뭐냐면 로그인 요청을 하면은 로그인인지 아닌지 SecurityConfig.java의 configure함수에서 .loginProcessingUrl("/auth/signin") 통해서 진행되는데 이때
UserDetailsService가 낚아챈다.
근데 UserDetailsService 자리에 PrincipalDetailsService가 IoC가 되니까 IoC에 들어갈려고 보니까 UserDetailsService의 부모타입이 같으니까 UserDetailsService가 없어지고 PrincipalDetailsService가 덮어진다.
사용자가 로그인 요청할때 username, password를 가지고 오면서 시큐리티 설정파일에
/auth/signin을 통해서 PrincipalDetailsService에서 로그인이 진행되는 프로세스다.
실행되는지 확인해보자.
@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { System.out.println("실행됩니까? " + username ); return null; }
Java
복사

*참고