2014-05-09 2 views
0

요청을 승인하기위한 커스텀 구현을 만들려고합니다.컨트롤러 메소드 용 Spring MVC 커스터마이즈 된 권한/보안

컨트롤러의 모든 메소드에서 주석을 사용하지 않도록 옵션을 평가 중입니다. 는 대신, 우리는 나는를 만들려 봄 3.2.5.RELEASE

를 URL에 필요한 권한을 사용하고있다

로그인 한 사용자 경우 확인하는 필터를 통해이 기능을 중앙 집중화 가능성을 탐구하고 권한과 관련 URL 간의 매핑이있는 데이터베이스 테이블입니다.

현재 URL에 대한 요청 매핑 정보를 얻는 방법을 찾고 있습니다. 예를 들어

: 내 데이터베이스에서, 내가 가진 :

URL=/view/{id} , permission=VIEW_USER 

현재의 URL 인 경우 :

/app/user/view/1 

, 방법은

@RequestMapping(value = "/view/{id}", method = RequestMethod.GET) 

가 호출됩니다 주석 . 그러나 이렇게되기 전에 로그인 한 사용자에게 사용자 세부 정보를 볼 수있는 권한이 있는지 확인해야합니다.

내 필터에서 현재 URL (/app/user/view/1)을 얻을 수 있습니다. 어떻게 대응 매핑 (/view/{id})을 얻을 수 있습니까? 해당하는 MVC 요청 매핑에 URL을 매칭시키는 메커니즘이 있습니까?

나는 관련 게시물을 보았고 봄 코드를 보았지만 아직 방법을 찾고 있습니다.

답변

0

이렇게하면 서블릿 필터 대신 MVC 인터셉터를 등록 할 수 있습니다. HandlerInterceptorAdapter을 확장하는 클래스를 만들고 preHandle 메서드에서 컨트롤러의 메서드 및 주석에 액세스 할 수 있습니다. 인터셉터의 전처리 방법은 다음과 같습니다.

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    if (handler instanceof HandlerMethod) { 
     HandlerMethod method = (HandlerMethod) handler; 
     if (method.getMethod().isAnnotationPresent(RequestMapping.class)) { 
      RequestMapping rqm = method.getMethodAnnotation(RequestMapping.class); 
      String[] urlMappings = rqm.value(); 
      //do security logic 
     } 
    } 
    ... 
} 

그러면 인터셉터를 등록해야합니다. 당신이 XML을 사용하는 경우는 다음과 같이 수행의 config :

<mvc:interceptors> 
    <bean class="com.example.MySecurityInterceptor" /> 
    ... 
</mvc:interceptors> 

당신의 접근 방식이 어려울 것이라는 점을 유의하시기 바랍니다, 당신은 지원을 봄 모든 요청 매핑 경우를 처리해야합니다. 예를 들어, 클래스 레벨에 주석이 달린 @RequestMapping과 같습니다. 또는 @RequestMapping 컨트롤러의 상위 클래스에 주석이 달려 있습니다.

+0

입력 해 주셔서 감사합니다. 다른 상황을 다루는 것에 대해 좋은 지적을했습니다. URL을 해당 요청 매핑과 일치시키는 방법을 알아낼 수 있다면 뭔가 할 수있을 것입니다. 스프링 MVC가 그렇게해야한다. 컨트롤러 메소드가 호출되도록 URL을 요청 매핑과 일치시키는 메커니즘이 있어야합니다.이를 파악할 수 있다면 도움이 될 수 있습니다. – souser

관련 문제