>  기사  >  Java  >  SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명

SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-03 11:07:031974검색

대부분의 시스템에서는 다양한 사용자가 볼 수 있는 콘텐츠를 결정하기 위해 권한 관리가 필요합니다. 그렇다면 Spring MVC에서 권한 확인을 구현하는 방법은 무엇일까요? 물론 이를 달성하기 위해 서블릿의 Filter 필터를 계속 사용할 수 있습니다. 그러나 Spring MVC의 액션 인터셉터를 사용하면 주석 기반 권한 확인을 구현할 수 있습니다.

SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명. 먼저 액션 인터셉터를 소개합니다.

HandlerInterceptor는 자체 처리 로직을 구현할 수 있도록 Spring MVC에서 제공하는 인터셉터 인터페이스입니다.

public interface HandlerInterceptor {  
    boolean preHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler)   
            throws Exception;  
  
    void postHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, ModelAndView modelAndView)   
            throws Exception;  
  
    void afterCompletion(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, Exception ex)  
            throws Exception;  
}


인터페이스에 3가지 메소드가 있는 것을 볼 수 있으며, 그 의미는 다음과 같습니다.

preHandle: 액션에서 처리 로직을 실행하기 전에 실행되며 boolean, 여기서 true를 반환하면 postHandle을 계속 실행하고 afterCompletion을 실행하고, false를 반환하면 실행을 중단합니다.

postHandle: 액션에서 로직을 실행한 후 뷰로 돌아오기 전에 실행됩니다.

afterCompletion: 작업이 뷰로 돌아온 후 실행됩니다.

HandlerInterceptorAdapter 어댑터는 HandlerInterceptor 사용을 용이하게 하기 위한 Spring MVC의 기본 HandlerInterceptor 구현입니다. 내부의 세 가지 메소드는 어떤 처리도 수행하지 않으므로 preHandle 메소드는 직접 true를 반환하므로 이후에 세 가지만 구현하면 됩니다. HandlerInterceptorAdapter 상속 메소드에서는 3개의 메소드가 필요한지 여부에 관계없이 구현해야 하는 HandlerInterceptor를 상속하는 것과 달리 필요한 메소드만 필요합니다.

물론 HandlerInterceptor의 도움으로 로깅, 요청 처리 시간 분석 등 다양한 기능을 구현할 수 있으며 권한 확인은 그 중 하나일 뿐입니다.


SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명. 주석 권한 확인 기능을 단계별로 완성해 보겠습니다.

먼저 계정 컨트롤러와 로그인 액션을 추가하고 권한이 없을 때 로그인 페이지로 점프하는 것을 시뮬레이션합니다.

com.demo.web.controllers에서. package AccountController.java:

package com.demo.web.controllers;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(value = "/account")public class AccountController {
    
    @RequestMapping(value="/login", method = {RequestMethod.GET})    public String login(){        
        return "login";
    }
    
}


views 폴더 아래에서 login.jsp 보기:

nbsp;html PUBLIC "-//W3C//DTD HTML 4.0SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><meta><title>Insert title here</title>
    这里是登录界面


새 패키지 com. 데모.web.auth에 사용자 정의 주석 AuthPassport를 추가하면 내용은 다음과 같습니다.

package com.demo.web.auth;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)public @interface AuthPassport {    boolean validate() default true;
}


HandlerInterceptorAdapter에서 상속된 AuthInterceptor를 구현하기 위해 자체 인터셉터를 추가하면 내용은 다음과 같습니다. :

package com.demo.web.auth;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class AuthInterceptor extends HandlerInterceptorAdapter {
    
    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        
        if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
            AuthPassport authPassport = ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class);            
            //没有声明需要权限,或者声明不验证权限
                if(authPassport == null || authPassport.validate() == false)                return true;            else{                
                //在这里实现自己的权限验证逻辑
                if(false)//如果验证成功返回true(这里直接写false来模拟验证失败的处理)
                    return true;                else//如果验证失败                {                    //返回到登录界面
                    response.sendRedirect("account/login");                    return false;
                }       
            }
        }        else
            return true;   
     }
}
구성 프로젝트의 springservlet-config.xml에 다음 내용을 추가합니다.

<interceptors>  
    <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> 
    <bean annotation></bean>  
    <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 -->
    <bean></bean></interceptors>

이렇게 하면 각 작업을 실행할 때 AuthInterceptor 처리가 호출됩니다. 작업에 우리가 정의한 AuthPassport 주석이 있는 것으로 확인되면 내부의 권한 확인 논리가 실행됩니다.

프로젝트 실행:

SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명

springservlet-config.xml에서 정의한 HelloworldController의 index 메소드가 실행되는 것을 확인할 수 있습니다.

아아아아

下面我们在HelloworldController的index方法上加上自定义注解AuthPassport:

@AuthPassport
@RequestMapping(value={"/index","/hello"})public ModelAndView index(){
    
    ModelAndView modelAndView = new ModelAndView();  
    modelAndView.addObject("message", "Hello World!");  
    modelAndView.setViewName("index");  
    return modelAndView;
}


重新运行项目:

SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명

可以看到正确执行了权限判断逻辑,这样我们只需要在我们在需要权限验证的action上加上这个注解就可以实现权限控制功能了。

 

注解式权限验证的内容到此结束。

 以上就是SpringMVC学习系列(9) 之 实现注解式权限验证的代码详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.