簡體   English   中英

Spring 啟動和 Angular 身份驗證 - 如何保護應用程序?

[英]Spring Boot and Angular authentication - how to secure the app?

所以我有這個遺留應用程序運行 spring MVC 和 JSP,從 mongo DB 讀取
,我正在考慮將其替換為使用 Spring 引導和 angular JS 的現代應用程序

我不是在尋找一個框架,我的問題是關於身份驗證的更多概念,以及它如何在 angular 和 Spring 引導之間工作。

我不想使用第三方進行身份驗證,我想繼續使用我的內部數據庫用戶和密碼。
我還有一個 rest API 客戶端需要先注冊,然后在繞過 angular 和身份驗證的每個請求上發送一個令牌。

所以在過去(古老的 j2ee)我有 Servlet 過濾器,這個過濾器對任何請求都運行,它檢查 session 是否經過身份驗證,如果沒有 - 它會轉發到身份驗證頁面,然后將結果存儲在 session 中。

類似這樣的東西:

@WebFilter("/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        String loginURI = request.getContextPath() + "/login";

        boolean loggedIn = session != null && session.getAttribute("user") != null;
        boolean loginRequest = request.getRequestURI().equals(loginURI);

        if (loggedIn || loginRequest) {
            chain.doFilter(request, response);
        } else {
            response.sendRedirect(loginURI);
        }
    }

    // ...
}

如何與 angular JS 做同樣的認證機制?
servlets 中的過濾器相當於什么?
由於 Angular 是客戶端渲染,如何保護它?

感謝您的任何意見!

顯而易見的想法: https://spring.io/guides/tutorials/spring-security-and-angular-js/

If you tried to serve angular on the same port using static resources, you will have a hard time setting it up with spring boot because there will be conflicts about who should resolve a particular resource: angular or spring boot. For eg: /home can be resolved by angular but spring isn't aware of the fact that there is a /home and if you hit /home directly, it won't be resolved by angular unless index.html was loaded and you will請參閱 404 Whitelabel 頁面。

如果您在單獨的端口上提供 angular 和 spring 引導,那么您必須閱讀上述 spring 指南中的此引用:

你不能擁有一個安全的、無狀態的應用程序。

補充一下Hopey One已經指出的內容:使用JHipster並沒有您想象的那么糟糕。 構建 80% 的項目幾乎不需要一天的時間,然后您可以相應地調整 rest 20%。 它將解決大部分知識空白,讓您編寫實際需要的代碼。 而且由於您已經有一個正在運行的應用程序,因此其中大部分將是復制粘貼工作。 您可以閱讀本指南來設置環境。

我不是在尋找一個框架,我的問題是關於身份驗證的更多概念,以及它如何在 angular 和 Spring 引導之間工作。

我發現這個回答特別棘手,因為您要求的是超出特定框架的概念性答案,但您指的是 Angular 和 Spring 這兩個框架,所以讓我們退后一步。

正確的身份驗證始終必須在服務器端執行,因為客戶端上的身份驗證很容易繞過。 您可以設置一些看門狗來禁止客戶端的某些路由,但只是為了改善用戶體驗。

基本上有兩種口味可供選擇:state 或無狀態

State 身份驗證是在身份驗證成功后,服務器將創建一些 session,存儲它的一些標識符,並在連續請求時對其進行驗證。 這是傳統的 session 和 cookies 方法,在 spring 中命名為 JSESSION。 這種方法的缺點是 state 必須在某個地方維護,除非您有粘性會話(您可以通過將這些信息保存在內存中來擺脫),否則您將需要一些分布式系統來存儲/檢索它(SQL db, cassandra,您的寵物項目等)。 但正如我們所知,高流量的分布式 state 會成為瓶頸,最好盡可能避免。

Stateless Authentication: As is the case of the JWT contains all the information needed to recreate the session on any server, so there is no distributed state, or better said, the state is in the client (browser), and is cryptographically signed so users可以訪問/篡改它們。 缺點是令牌的加密/解密可能需要一點 CPU,但對用戶來說沒有什么明顯的。

因此,一旦您確定了上述一項,rest 並沒有什么不同。 在這兩種情況下,您都必須在 angular 上實現一些攔截器,以便根據具體情況在每個請求上發送 cookie 或 Auth header,並且在服務器端,您必須通過相應的過濾器處理請求。 除了第一個示例中的 cookie,您可以以更 RESTful 的方式發送 session 值和 header 值。

我還有一個 rest API 客戶端需要先注冊,然后在繞過 angular 和身份驗證的每個請求上發送一個令牌。

這看起來像是您的 API 的新用例,但上述情況成立,您仍然可以在登錄完成並將令牌/會話返回給身份驗證用戶后使用這些身份驗證標頭進行授權。 您還可以為這種類型的客戶端使用不同的身份驗證令牌,在這種情況下,只需鏈接一個新的過濾器來檢查此 header,而無需對您的 API 進行任何更改。

我相信您會在網上找到合適的資源來實施您想要的身份驗證/授權解決方案

看看JHipster項目。 無需太多努力,您就可以生成一個基於 angular 和 spring 引導的簡單項目。 它實現了 JWT 以使用您選擇的數據庫進行身份驗證。 可以作為一個很好的引導程序或作為實現項目的參考實現。

我建議探索這兩個主題:

Filterservlet-api的一部分,這意味着過濾器可以在任何庫中實現,並且 web 服務器將注冊 map 到特定的 url。 在我們的例子中,您的LoginFilterJWTAuthenticationFilter相同,但具有 Spring 框架的附加功能,這兩個類都實現了Filter接口。

使用 Spring 啟動,您想使用 Spring 安全性並盡可能建立在框架之上。 我看到三種方法:

暫無
暫無

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

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