簡體   English   中英

在Web應用程序Java EE / Spring的一部分上實現自定義安全性/過濾器

[英]Implement custom security/filters on a part of a web app Java EE/Spring

我正在使用Spring MVC和Spring安全性的Java EE Web應用程序上工作。 到目前為止,我已經使用自定義的userService成功實現了常見的安全功能(該功能從數據庫中檢索信息),但是現在我面臨着一個新的安全問題,我真的不知道解決該問題的最佳方法。 。

這是我需要做的:允許在我的應用中進行身份驗證的用戶瀏覽其項目,但只能打開他們有權訪問的項目(並打開內部內容),而不能打開其他項目。

我當前的實現是通過導航(用戶界面)來處理它的,該導航僅向用戶提供授權項目的列表。 但是,如果聰明的用戶直接編輯URL來打開具有另一個ID的項目,則無需對該項目ID進行授權測試,並且該用戶將完成操作,從而可以輕松打開項目。

因此,我想添加的是對打開項目或項目中的每個請求的控件。 該控件將測試當前用戶是否可以打開所請求的項目ID。 否則,它將向用戶返回拒絕訪問頁面。 該控件本身很容易實現,但是由於其中包含一些代碼,因此在我的應用程序的許多方法中我都想找到最干凈的方法!

您認為實現此目標的最佳方法是什么? 我考慮了幾種可能性,但我需要建議:

1)使用servlet過濾器?

2)使用自定義authenticationManager在Spring安全性上添加特殊訪問權限? 就像是 :

 <security:intercept-url pattern="/open*" access="canOpen()" /> 

(但是我不確定如何定義它以及是否能夠從原始請求中獲取參數...)

3)使用面向方面的編程? (但我在某處讀到它不適用於控制器調用)

4)使用Spring攔截器?

5)其他想法?

預先感謝您的幫助!

我建議您使用自定義的PermissionEvaluator,以便基本上可以在網頁和控制器中使用相同的實現:

在網頁中,您可以使用:
<security:authorize access="hasPermission(#project,'read')"></security:authorize>

在控制器和任何服務方法中,都可以使用:
@PreAuthorize("hasPermission(#project,'read')")

@PostAuthorize@PostFilter("hasPermission(filterObject,'read')") (用於列表)

所有這些功能都將根據您自己的權限評估程序來限制訪問或過濾結果列表。 它們都指向相同的實現,看起來像這樣:

@Component
public class MyPermissionEvaluator implements PermissionEvaluator {

    private final Log logger = LogFactory.getLog(getClass());

    @Override
    public boolean hasPermission(Authentication auth, Object arg1, Object arg2) {
        logger.info("hasPermission "+auth+" - "+arg1+" - "+arg2+" ");
        if(arg2 instanceof String && arg1 instanceof MyProject){
            MyProject project = (MyProject)arg1;
            if(((String) arg2).equals("read")){
                boolean result = hasPermissionReadProject(auth, project);                   
                return result;
            }
        }
        return false;
    }

    @Override
    public boolean hasPermission(Authentication arg0, Serializable arg1,
        String arg2, Object arg3) {
        logger.info("hasPermission "+arg0+" - "+arg1+" - "+arg2+" - "+arg3+" ");
        return false;
    }
}

同樣,當這些方法返回false時,它會自動引發AccessDeniedException,您可以輕松地將其配置為重定向到http元素中自己的accessDenied頁面:

<http auto-config="true">
    <intercept-url pattern="/admin*" access="ROLE_ADMIN" />
    <access-denied-handler error-page="accessDeniedPage"/>
</http>

我沒有使用Spring Security,但是我不得不面對類似的情況。

我選擇實施數據庫訪問驗證。 我的每個請求都有一個內置的用戶/數據確認。 也許這不是最簡單的方法,但是通過這種方式,用戶只能請求他們可以讀取/寫入的數據。 我從來沒有遇到任何麻煩。

我的請求適用於已登錄的用戶角色。 例如,在我的情況下,如果用戶是學生,則他只能訪問自己的文件夾,但是如果是老師,則他可以訪問所教學生的文件夾。

請求(簡化​​很多!)[使用IBatis]:

SELECT * 
    FROM FOLDER F 
    <dynamic prepend="WHERE">
        <isNotEmpty property="user">
            <isEqual property="user.role" compareValue="student">
                F.ID_STUDENT = #user.idStudent:NUMERIC#
            </isEqual>
            <isEqual property="user.role" compareValue="teacher">
                F.ID_STUDENT IN 
                    (SELECT ID_STUDENT 
                        FROM CLASSES 
                    WHERE ID_TEACHER = #user.id:NUMERIC#)
            </isNotEmpty>
        </isNotEmpty>
        <isEmpty property="user">
            F.ID IS NULL
        </isEmpty>
    </dynamic>

暫無
暫無

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

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