簡體   English   中英

Spring MVC控制器方法的自定義授權/安全性

[英]Spring MVC custom authorization/security for controller methods

尋找創建自定義實現以授權請求。

我正在評估選項,以避免在控制器的每個方法上使用注釋。 相反,我正在探索通過過濾器將該功能集中化的可能性,該過濾器檢查登錄用戶是否具有所需的URL許可權

我們正在使用Spring 3.2.5.RELEASE

我打算創建一個數據庫表,該表在許可權和相關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} )? 是否存在將URL與其對應的MVC請求映射相匹配的機制?

我看過/正在看SO上的相關文章,也看過Spring代碼,但還沒有找到方法。

如果您想這樣做,可以注冊MVC攔截器而不是servlet過濾器。 創建一個擴展HandlerInterceptorAdapter的類,並在preHandle方法中可以訪問控制器的方法及其注釋。 攔截器的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>

請注意,您的方法將很困難,您將需要處理spring支持的所有請求映射案例。 例如,在類級別上注釋的@RequestMapping 或在控制器的父類上注釋的@RequestMapping等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM