스프링 시큐리티에서 제공하는 로그인 페이지는 사실 너무 기본이라서 실제로 써먹긴 어렵다.
그래서 미리 구현해놓은 내 login 페이지로 바꿔치기 하고자 한다.
그러기 위해서는 SecurityConfig.java를 수정한다!
@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/login","/service","/resources/**").permitAll() .antMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated() .antMatchers("/**").permitAll() .and() .formLogin() .loginPage("/login") .loginProcessingUrl("/loginProcess") .defaultSuccessUrl("/loginSuccess") .permitAll() .and() .logout() .permitAll(); }
.formLogin() 아래를 보면,
.loginPage("로그인 페이지 경로") -> 앞으로 로그인은 이 경로에서 수행하게 된다는 뜻이다.
.loginProcessingUrl("로그인 처리 경로") -> 로그인 form 의 action 과 일치시켜주어야 한다.
여기엔 없지만 .usernameParamater, .passwordParameter 를 통해 내 폼의 아이디, 패스워드 네임과 매핑할 수 있는데
나는 폼 자체를 디폴트 값인 username, password로 맞추어주었기 때문에 필요가 없었다.
그리고 daultSuccessUrl 을 통해 성공 시 이동할 경로까지!
컨트롤러에 경로 추가!
@RequestMapping(value="/login", method=RequestMethod.GET) public String loginByGet(Model model,HttpServletRequest req){ model.addAttribute("message",req.getServletContext()); return "loginPage"; }
@GetMapping("/loginSuccess") @ResponseBody public String loginSuccess(HttpServletRequest req){ return accounts.getAccount().getType(); }
위에 로그인 경로에 대한 View 리턴해주고,
로그인 성공 경로는 알아서 하도록 한다
그리고 로그인 폼으로 슝슝간다.
<div class="container"> <div class="row" style="padding-top:20%"> <div class="col-md-4 "></div> <div class="col-md-4" style="flex-align:center"> <div class="card"> <h5 class="card-header">로그인</h5> <div class="card-body"> <form action='/loginProcess' method='POST' > <div class="form-group"> <label for="InputId"> 아이디</label> <input type="text" class="form-control" id="username" name="username" placeholder="ID"> </div> <div class="form-group"> <label for="InputPassword1">패스워드</label> <input type="password" class="form-control" id="password" name="password" placeholder="Password"> </div> <div class="checkbox"> <label> <input type="checkbox"> 아이디 기억하기 </label> </div> <button name="submit" type="submit" class="btn btn-block btn-primary text-light">로그인</button> </form> </div> </div> </div> </div> </div>
체크할 부분은 method="post", action="loginProcess" 이다.
이렇게만 추가하고 로그인을 실행하면
아 안된다! 진짜 겁나 삽질했는데 ㅠㅠ
spring security 를 사용하면 이런 방식으로 post가 불가하다고 한다.
csrf 예방을 위한 코드를 한줄 더 추가해준다!
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
form 태그 안에 위치시키면 아 성공~!
힘들었다! 이제 로그인 끝냈지만 시큐리티 했으면 사실상 목적 절반은 달성이라 앞으로 진도 쭉ㄲ쭉빼서 담달 안에 멋진 페이지 하나 만들어볼테다