2013-02-19 3 views
1

@Postfilter가 트리거되지 않습니다.스프링 보안 @Postfilter가 트리거되지 않음

내 컨트롤러에는 두 가지 방법이 있습니다. listJson 메서드는 list1 메서드를 호출하여 모든 프로젝트를 가져 와서 json 형식으로 반환합니다. 나는 프로젝트를 필터링하는 list1 메서드에 @Postfilter가 있고 필터는 트리거되지 않습니다.

구성에 문제가 없습니다. 테스트 목적으로 @Postfilter를 listJson 메소드에 두었으므로 트리거합니다. 이 문제에 대해 친절하게 도와 줄 수 있습니까? 나는 매우 감사하게 될 것입니다.

@RequestMapping(produces = "application/json") 
    @ResponseBody 
    public String listJson(HttpServletRequest request, HttpServletResponse response) { 

    List<Project> items = list1(request, response, Project.class); 
    return JsonHelper.toJsonArray(items, request.getContextPath()); 
    } 

    @PostFilter("hasPermission(filterObject, 'read')") 
    private List<Project> list1(HttpServletRequest request, HttpServletResponse response, Class<Project> clazz) { 
    Integer[] ia = WebHelper.getDojoGridPaginationInfo(request); 
    Integer firstResult = ia[0]; 
    Integer lastResult = ia[1]; 

    Entry<String, String> orderBy = WebHelper.getDojoJsonRestStoreOrderBy(request.getP arameterNames()); 
    Where where = WebHelper.FromJsonToFilterClass(request.getParamet er("filter")); 
    List<Project> items = JpaHelper.findEntries(firstResult, lastResult - firstResult + 1, orderBy, where, clazz); 
    Integer totalCount = JpaHelper.countEntries(where, clazz).intValue(); 

    WebHelper.setDojoGridPaginationInfo(firstResult, lastResult, totalCount, response); 

    return items; 
    } 

webmvc-config.xml에

 <security:global-method-security pre-post-annotations="enabled" proxy-target-class="true"> 
     <security:expression-handler ref="expressionHandler"/> 
     </security:global-method-security> 

     <bean id="myPermissionEvaluator" class="org.springframework.security.acls.AclPermis sionEvaluator"> 
     <constructor-arg ref="aclService" /> 
     </bean> 

     <bean id="expressionHandler" class="org.springframework.security.access.express ion.method.DefaultMethodSecurityExpressionHandler" > 
     <property name="permissionEvaluator" ref="myPermissionEvaluator"/> 
     </bean> 

답변

1

목록 1 방법을 사용하여 클래스 내부의 방법을 다루고있는 같은 보안 조언을 호출되지 않습니다 listJson 같은 클래스/인스턴스의 경우.

그러나 list1 메소드를 주입 ​​된 서비스 클래스로 이동하려면 주석을 존중할 조언 된 객체가 있어야합니다.

편집 나는이 좀 더 명확하게하고 싶었 - 그래서 나는 희망을 설명하는 다이어그램을 포함하고있어이 더 명확하게

/mapping -> Project.listJson(HttpServletRequest, HttpServletResponse) | 
                     | 
                     | 
                     | 
                  --------------------- 
                  | listJson   | 
                  |     |---------| 
                  |     |   | 
                  |     |   | list1 
                  |     |   | 
                  |     |   | 
                  |     |   | 
                  |     |   | 
                  | list1   |<--------| 
                  |     | 
                  |     | 
                  --------------------- 

/mapping -> Project.listJson(HttpServletRequest, HttpServletResponse) | 
                     | 
                     | 
                     | 
                  --------------------- 
                  | listJson   |<--------------------------------| 
                  | svc.list1   |--------->advised(Service)  | run @PostFilter 
                  |     |   |      | 
                  |     |   | list1     | 
                  ---------------------   |      | 
                          |      | 
                  ---------------------   |      | 
                  | Service   |   |      | 
                  | list1    |<--------|      | 
                  |     |         | 
                  |     |---------------------------------| 
                  --------------------- 
관련 문제