우리는 회원가입에 필요한 joinProc uri를 UserApiController에 정의했었다. 그러나 로그인에 필요한 메서드는 만들지 않는다. 왜? 시큐리티가 가로채가서 로그인을 실행하기 때문.
SecurityConfigure 수정
이제 로그인을 시큐리티가 실행할 수 있게 수정해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
@Override protectedvoidconfigure(HttpSecurity http)throws Exception { http .csrf().disable() //csrf 토큰 비활성화 .authorizeRequests()//요청이 왔을 때 .antMatchers("/","/auth/**","/js/**","/css/**","/image/**") // /auth로 시작하는건 .permitAll() //모두 접근 가능 .anyRequest() //이 외의 다른 요청은 .authenticated() // 인증해야 접근 가능 .and() // 인증이 필요한 경우 .formLogin() // 로그인 할 수 있도록 한다. .loginPage("/auth/loginForm") //이 로그인 페이지에서 .loginProcessingUrl("/auth/loginProc") //시큐리티가 해당 주소로 오는 로그인 가로채고 수행 .defaultSuccessUrl("/"); //요청이 성공하고 나서 해당 주소로 이동. //.failureUrl("/auth/loginForm");//실패시 해당 주소로 이동. }
.and()부터 로그인에 관련된 내용이다!
config 패키지 하위에 auth 패키지 만들고 클래스 작성
로그인하고 나면 시큐리티 세션에 사용자 정보가 UserDetails 형으로 저장된다고 했다. 이때 UserDetails는 인터페이스로, 이를 구현한 클래스가 필요하다.
그래서 유저 정보를 담을 PrincipalDetail를 UserDetails의 추상메소드를 구현해서 만들어보자
publicclassPrincipalDetailimplementsUserDetails{ private User user; publicPrincipalDetail(User user){};
//계정이 어떤 권한을 가졌는지. @Override public Collection<? extends GrantedAuthority> getAuthorities() { Collection<GrantedAuthority> collectors = new ArrayList<>(); collectors.add(()->{return"ROLE_"+user.getRole();});//role 앞에 ROLE_붙이는건 규칙!!! return collectors; }
@Override public String getPassword(){ return user.getPassword(); }
@Override public String getUsername(){ return user.getUsername(); }