6.관리자 로그인

강재영's avatar
Dec 16, 2024
6.관리자 로그인
 

1.login-from.mustache

form으로 username과 password를 post 요청
<div class="login-container"> <!-- 로고 자리 --> <img src="/img/logo.png" alt="관리자 로고" class="logo"> <!-- 로그인 폼 --> <h4 class="text-center mb-4">관리자 로그인</h4> <form action="/admin/login" method="post"enctype="application/x-www-form-urlencoded"> <div class="form-group mb-3"> <label for="email">아이디</label> <input type="text" class="form-control" id="username" name="username" placeholder="아이디를 입력하세요" value="admin" required> </div> <div class="form-group mb-3"> <label for="password">비밀번호</label> <input type="password" class="form-control" id="password" name="password" placeholder="비밀번호를 입력하세요" value="1234" required> </div> <button type="submit" class="btn btn-login w-100">로그인</button> </form> </div>
 

2.controller에서 받기

DTO를 만들어서 받았다.
@PostMapping("/admin/login") public String adminLogin(AdminRequest.LoginDTO loginDTO){ Admin sessionAdmin = adminService.로그인(loginDTO); session.setAttribute("sessionAdmin", sessionAdmin); return "admin/dashboard"; }

2.1 인터셉터

public class AdminInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Admin sessionAdmin = (Admin) session.getAttribute("sessionAdmin"); if (sessionAdmin == null) { throw new Exception401("인증되지 않았어요"); } return true; } }

2.2

@Configuration // Ioc에 저장됨 메모리에 띄운다. public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/api/**"); registry.addInterceptor(new AdminInterceptor()) .addPathPatterns("/admin/**") .excludePathPatterns("/admin") // 관리자 로그인 페이지 예외 처리 .excludePathPatterns("/admin/login"); // 관리자 로그인 처리 POST 요청 예외 처리 } }
요청이 들어올떄 /admin에 관한 요청은 인터셉터가 제어를 하게 하였다.
이렇게 한 이유는 인증이 필요한 controller에 인증로직을 매번 등록하지말고 인터셉터로 빼서 코드를 깔끔하게 유지하고 한번에 관리가 용이하기 때문에 인터셉터를 만들었다.
 

3. Service

@RequiredArgsConstructor @Service @Transactional(readOnly = true) public class AdminService { private final AdminRepository adminRepository; private final AdminQueryRepository adminQueryRepository; public Admin 로그인(AdminRequest.LoginDTO loginDTO) { Admin admin = adminRepository.mFindByOneUsernameAndPassword(loginDTO.getUsername(),loginDTO.getPassword()) .orElseThrow(() -> new Exception401("인증되지 않았습니다")); return admin; } }
넘겨주는 response를 entity로 넘겨주었는데 이걸 adminDTO로 만들어서 넘겨줘야 할지 고민이된다.
 

4.repository 및 테스트

 
public interface AdminRepository extends JpaRepository<Admin, Long> { @Query("select a from Admin a where a.username=:username and a.password=:password") Optional<Admin> mFindByOneUsernameAndPassword(@Param("username") String username, @Param("password") String password); }
 
@Test public void mFindByOneUsernameAndPassword_test(){ Admin admin = adminRepository.mFindByOneUsernameAndPassword("ssar","1234").get(); System.out.println(admin.getUsername()); System.out.println(admin.getName()); }
 
넘겨줄때 optional을 사용해서 안전하게 넘겨주었고 서비스단에서 제대로 데이터가 넘어오지 않는다면 예외처리를 진행하였다.
 
notion image
 
Share article

강재영 블로그