📌

【初心者向け/ITスクール 75日】個人プロジェクトスタート10日目

2023/11/03に公開

はじめに

今日も相変わらず、Pathvariableで苦戦しました。
特に、updateの際によりによってbuttonが二つあったので、GET要請をし、
会員退会ページを作成しました。

th:onclick="|location.href='@{delete}'|"

なんとなく偶然に職別idを付けることができました。

保安

管理者権限と、メンバー権限を分け、保安を強化するのが一番大事だと考え、interceptionを勉強し、活用してみました。

LoginCheckInterceptor
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {

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

        String requestURI = request.getRequestURI();
        log.info("認証チェック {}", requestURI);

        HttpSession session = request.getSession();

        if(session == null || session.getAttribute("loginMember") == null){
            log.info("未認証ユーザーの要請");
            //ログインに redirect
            response.sendRedirect("/login?redirectURL=" + requestURI);
            return false;
        }
        return true;
    }

}
MemeberCheckInterceptor
@Slf4j
public class MemberCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession();
        Member member =  (Member)session.getAttribute("loginMember");

        String currentId = member.getMemberId();
        String requestedMemberId = null;

        String requestURI = request.getRequestURI();
        String[] path = requestURI.split("/");

        //要請URIからURIを抽出
        if(path.length > 2 && path[1].equals("members")){
            requestedMemberId = path[2];
        }

        //現在ユーザーのIDと要請したユーザーのIDが異なる場合404エラー
        if(requestedMemberId!=null && !currentId.equals(requestedMemberId)){
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return false;
        }

        return true;
    }
}

WebConfig
package com.hyon01.minishop;

import com.hyon01.minishop.web.interceptor.LoginCheckInterceptor;
import com.hyon01.minishop.web.interceptor.MemberCheckInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new LoginCheckInterceptor())
                .order(1)
                .addPathPatterns("/**")
                .excludePathPatterns("/", "/members/add", "/login", "/logout",
                        "/css/**", "/*.ico", "/error","/images/**");

        registry.addInterceptor(new MemberCheckInterceptor())
                .order(2)
                .addPathPatterns("/members/**")
                .excludePathPatterns("/", "/members/add", "/login", "/logout",
                        "/css/**", "/*.ico", "/error","/images/**");
    }

}

結果

TEST1がTEST2の情報にアクセス要請

Discussion