spring bootではスクリーンセーバーを利用して権限制御を実現します.

5909 ワード

SpringのInterceptorブロッキング要求は、Handler Interceptorによって実現されます.SpringでIntercepterを定義するのは非常に簡単で、主に2つの方法があります.【第一の方法】は定義するInterceptor類がSpringのHandlerInterceptorインターフェースを実現するために、またはこの種類の継承がHandler Interceptorインターフェースを実現した種類です.例えばSpringが提供されたHandlerInternetインタフェースの抽象的なHandler Internet Proterクラスです.【第二の方法】Springを実現するWebrequest InterceptorインターフェースまたはWebrequest Interceptorを継承して実現したクラスです.主に3つの方法でブロック業務を実現します.
//               (  true,    ;  false,     ;  ,            )
public boolean preHandle (
          HttpServletRequest request, 
          HttpServletResponse response, 
          Object handle) 

//             (   :    ,    ,    ,     )
public void postHandle (
          HttpServletRequest request, 
          HttpServletResponse response, 
          Object handle, 
          ModelAndView modelAndView)

//            Interceptor  preHandle        true      (                     )
public void afterCompletion(
          HttpServletRequest request, 
          HttpServletResponse response, 
          Object handler, Exception ex) throws Exception
スクリーニングの3つの方法の具体的な紹介:【preHandle方法】preHandle(HttpServletRequest request、HttpServlet Respnse reponse、Object handle)方法は、文字通り、要求処理の前に呼び出します.SprigMVCのInterceptorはチェーン式の呼び出しであり、一つのアプリケーションまたは一つの要求に複数のInterceptorが同時に存在することができる.各Interceptorの呼び出しは、その声明の順序に従って順次実行され、最初に実行されるのは、IntercepterにおけるpreHandle方法であるので、この方法では前置初期化操作や、現在要求されている一つの前処理を行っても良いし、この方法では、要求が継続するかどうかを判断しても良い.この方法の戻り値は、ブール値Booleanタイプであり、falseに戻ると、要求が終了し、後続のInterceptorとControllerは再実行されないことを示す.戻り値がtrueの場合は、次のIntercepterのpreHandleメソッドを呼び出し続けます.最後のInterceptorの場合は、現在の要求を呼び出すController方法です.
【postHandle方法】postHandle(HttpServletRequest request、HttpServletResonse reponse、Object hadle、ModelAndView)方法は、preHandle方法の解釈によって、後に述べるafter Hattleメソッドのみが呼び戻されます.PostHandle方法は、名前の通り、現在の要求が処理された後、つまりControllerメソッドの呼び出し後に実行されますが、DisparterServletがビューを行ってレンダリングする前に呼び出されますので、この方法でController処理後のModelAndViewオブジェクトを操作することができます.postHandleメソッドが呼び出される方向はpreHandleとは逆で、先に声明したInterceptorのpostHandle方法は逆の後に実行されます.これはStruts 2のIntercepterの実行過程と少しタイプがあります.Struts 2内のInterceptorの実行プロセスもチェーン式であり、Struts 2内ではActinvocationのinvokeメソッドを手動で起動して次のInterceptorまたはアクションの呼び出しをトリガし、各Interceptorのinvokeメソッドの呼び出し前の内容は声明の順序で実行されます.invokeの方法の後の内容は逆です.
【after Comppletion方法】afterComplect request request、HttpServletResonse reponse、Object handle、Exception ex)方法は、現在対応するInterceptorのpreHandle方法の戻り値がtrueの時に実行されます.この方法は、要求全体が終了した後、すなわちDispactch Servletに対応するビューをレンダリングした後に実行される.この方法の主な役割は資源整理作業を行うためのものである.
【以下はspring bootにおけるブロックの運用】
【ブロック類の登録】WebAppConfig
/**
 * Created by mis on 2016/7/30.
 * @author lvfang
 */
@EnableWebMvc
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {

    //        
    @Bean
    HiseeInterceptor hiseeInterceptor(){
        return new HiseeInterceptor();
    }

    /**
     *      
     *
     * @param registry
     * @author lvfang
     */
    public void addInterceptors(InterceptorRegistry registry) {

        //          HandlerInterceptor      
        registry.addInterceptor(hiseeInterceptor())
                .addPathPatterns("/**")//       
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/exit");//      

   }
}

【権限判断のパッケージクラス】BaseInterceptor
/**
 * Created by mis on 2017/5/25.
 * @author lvfang
 */
public class BaseInterceptor {

    /**
     *       
     * @param permissionDomainRepository
     * @param url
     * @return
     */
    public boolean isHavePermiss(PermissionDomainRepository permissionDomainRepository, UserInfo userInfo, String url){
        boolean falg = false;

        //      
        Set permissionInfos = permissionDomainRepository.findPermissionByUid(userInfo.getId());

        //      
        Iterator iterator = permissionInfos.iterator();

        while(iterator.hasNext()){
            PermissionInfo permissionInfo = iterator.next();
            if(permissionInfo.getpUrl().equals(url)){
                falg = true;
            }
        }
        return falg;
    }
}

【具体的な権限実現】ブロック実現:Hisee Interceptor
/**
 *    
 */
@Component
public class HiseeInterceptor extends BaseInterceptor implements HandlerInterceptor {

    @Autowired
    private PermissionDomainRepository permissionDomainRepository;

    @Autowired
    private UserInfoMapper userInfoMapper;

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

        //  session  
        UserSession userSession = SpringUtil.getBean(UserSession.class);
        HiseeInterceptor userInterceptor = new HiseeInterceptor();

        //    
        boolean isLogin = userSession.isLogin();
        //    
        String url = request.getRequestURI();  //  /user/deleteUser
        UserInfo userInfo = userInfoMapper.findUserInfoById(userSession.getUserId());

        //    
        if(!isLogin){
            System.out.println("    ... ...");
            return false;
        }

        //      
        boolean pstate = userInterceptor.isHavePermiss(permissionDomainRepository,userInfo,url);
        if(!pstate){
            System.out.println("    ... ...");
            return false;
        }

        System.out.println("     ... ...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }

}

【参考】http://elim.iteye.com/blog/1750680