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을 사용해서 안전하게 넘겨주었고 서비스단에서 제대로 데이터가 넘어오지 않는다면 예외처리를 진행하였다.

Share article