IT/development

[springBoot] springBoot Interceptor 로그인 체크

알 수 없는 사용자 2023. 5. 13. 16:28
반응형

LoginInterceptor

package study.thboard2.common.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Slf4j
//로그인 인터셉터
public class LoginInterceptor implements HandlerInterceptor {
	//아래처럼 의존성 주입하려면 config에서 @Bean으로 등록해야 함
	//@Autowired
    //private LoginService loginService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();
        log.info("interceptor_requestURI = [{}]", requestURI);

        HttpSession session = request.getSession();
        if ("none".equals(session.getAttribute("id")) || session.getAttribute("id") == null) {
            log.info("로그인을 안했네? 로그인으로 가버려~~~~~~~~~");
            response.sendRedirect("/login");
            return false;
        }
        log.info("옳지! 로그인 상태구나. 너 하고 싶은데로 가라.");
        log.info("stored_session_id = [{}]", session.getAttribute("id"));
        return true;
    }
}

인터셉터를 config에 추가

package study.thboard2.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import study.thboard2.common.interceptor.LoginInterceptor;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LoginInterceptor loginInterceptor = new LoginInterceptor();
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "logout", "/css/**", "/asset/**", "/js/**");
    }   
    //만일 로그인 인터셉터에서 의존성을 주입해서 사용하기 위해선 new를 통해 인터셉터 등록하면 
    의존성 클래스에서 npe발생하기 때문에 아래처럼 빈으로 등록해서 사용할 것
    //@Bean
    //public LoginInterceptor loginInterceptor() {
    //    return new LoginInterceptor();
    //}
}

로그인 컨트롤러

package study.thboard2.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import study.thboard2.service.UserService;

import javax.servlet.http.HttpSession;

@Controller
@Slf4j
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 로그인 화면
     * @param session
     * @return
     */
    @GetMapping("/login")
    public String loginForm(HttpSession session) {
        String id = (String) session.getAttribute("id");
        log.info("stored session id =[{}]", id);
        return id != null ? "redirect:/" : "pages/login" ;
    }

    /**
     * 사용자 로그인
     * @param userId
     * @param userPassword
     * @param session
     * @return
     */
    @PostMapping("/login")
    public String login(@RequestParam String userId,
                        @RequestParam String userPassword,
                        HttpSession session) {

        String id = userService.login(userId, userPassword);
        session.setAttribute("id", id);
        return "redirect:/";
    }

    /**
     * 로그아웃 처리
     * @param session
     * @return
     */
    @PostMapping("logout")
    public String logout(HttpSession session) {
        session.invalidate();
        return "redirect:/login";
    }
}

로그인 서비스

package study.thboard2.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import study.thboard2.domain.vo.UserVo;
import study.thboard2.mapper.UserMapper;

import java.util.List;

@Service
@Slf4j
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class UserService {

    private final UserMapper userMapper;

    /**
     * 사용자 목록 조회
     * @return
     * @throws Exception
     */
    public List<UserVo> getUserList() throws Exception{
        return userMapper.selectUserList();
    }

    /**
     * 사용자 정보 저장
     * @param  userVo
     * @throws Exception
     */
    public void regUser(UserVo userVo) {
        userMapper.insertUser(userVo);
    }

    /**
     * 아이디/비밀번호 확인
     * @param userId
     * @param userPassword
     * @return
     */
    public String login(String userId, String userPassword) {
        UserVo userInfo = userMapper.selectByUserId(userId);
        return (userInfo != null && userInfo.getUserPassword().equals(userPassword)) ? userInfo.getUserId() : "none";
    }

    /**
     * 사용자 상세 정보
     * @param userNo
     * @param userId
     * @return
     * @throws Exception
     */
    public UserVo getUserDetail(Integer userNo, String userId) throws Exception{
        return userMapper.selectUserDetail(userNo, userId);
    }

    /**
     * 사용자 정보 수정
     *
     * @param userVo
     * @throws Exception
     */
    public void modifyUser(UserVo userVo) throws Exception{
        userMapper.updateUser(userVo);
    }

    /**
     * 사용자 삭제
     *
     * @param userNo
     * @param userId
     * @throws Exception
     */
    public void removeUser(Integer userNo, String userId) {
        userMapper.delUser(userNo, userId);
    }
}
반응형