본문 바로가기

개발/Java & Spring

[Spring] Spring boot security 로그인 뷰 변경하기-개발일기A-[4]

스프링 시큐리티에서 제공하는 로그인 페이지는 사실 너무 기본이라서 실제로 써먹긴 어렵다.

그래서 미리 구현해놓은 내 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 태그 안에 위치시키면 아 성공~!

힘들었다! 이제 로그인 끝냈지만 시큐리티 했으면 사실상 목적 절반은 달성이라 앞으로 진도 쭉ㄲ쭉빼서 담달 안에 멋진 페이지 하나 만들어볼테다