簡體   English   中英

Dropwizard View身份驗證示例

[英]Dropwizard View authentication by example

我熟悉在Dropwizard中實現BasicAuth安全性,但僅適用於RESTful端點/資源。

我現在正在對Dropwizard Views進行試驗,以查看是否可以將它同時用作Web和REST服務器。 該Web應用程序將具有真正構成應用程序的“公共”頁面(實際上只是靜態HTML文件;“關於我們”,“聯系我們”等)以及“私人”(動態)頁面。 要進入這些頁面,必須對用戶進行身份驗證(登錄)。

因此,這意味着我需要兩種不同的DW身份驗證機制:

  • 我熟悉的用於驗證REST API客戶端的典型DW安全機制;
  • 一種實現登錄系統以驗證Web應用程序頁面/資源的最終用戶的方法

理想情況下,我希望Apache Shiro可以為我的系統處理所有身份驗證(REST和Web均如此),並且我看到了Dropwizard-Shiro lib,但這似乎僅對REST端點進行身份驗證。


我的網絡登錄系統需要像這樣工作:

  1. 用戶嘗試轉到“經過身份驗證的”(專用)URL。
  2. 一個servlet過濾器(由我創建自己並向environment注冊)可以攔截該請求,並可以告知(也許是cookie / session var?)該用戶是否已通過身份驗證。
  3. 如果用戶已通過身份驗證,則允許他們繼續使用其預期的URL(“ 目標URL ”)。 否則,它們將被重定向到登錄頁面。 當他們登錄DW資源/控制器時,將其憑據交給Shiro,然后由Shiro決定憑據是否有效。
  4. 如果憑據有效,則它們將獲得cookie /會話var(?),並被重定向到其目標URL。 否則,它們將被重定向回到登錄頁面,該頁面現在將顯示失敗消息。

我主要關心的是:* 我應該為servlet檢查的cookie / session var實現什么? ; 和* 如何將我的auth控制器(即處理登錄頁面和目標URL之間的重定向的資源)與Shiro集成在一起? 是否可以通過該Dropwizard-Shiro庫執行此操作?

迄今為止我最大的嘗試:

自定義Servlet過濾器(在environment注冊):

public class AuthFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, 
            ContainerResponseContext responseContext) {
        Cookie[] cookies = requestContext.getCookies();
        boolean authenticated = false;
        for(Cookie cookie : cookies) {
            // 1. This is my first concern. What is better/more secure
            //    than what I'm doing here?
            if("my_app_auth_cookie".equals(cookie.getName())) {
                authenticated = true;
            }
        }

        if(authenticated == false) {
            responseContext.sendDirect("/auth/login");
        }
    }
}

如果未通過身份驗證,則將它們重定向到/auth/login ,它會命中AuthController (同樣,已在environment注冊為資源):

@Path("/auth")
@Produces(MediaType.TEXT_HTML)
public class AuthController {
    @GET
    @Path("/login")
    public LoginPageView login() {
        // Render some "login.ftl" template as HTML.
    }

    @POST
    @Path("/authenticate")
    public ??? authenticate(??? username, ??? password) {
        // 2. Somehow send 'username' and 'password' to Shiro...
        MyAppUser user = myAppRealm.authenticate(username, password);

        // Now what do I do with 'user'?
    }
}

當用戶在登錄頁面上提交表單(可能是POST到/auth/authenticate )時,我們會以某種方式將輸入的憑據交給Shiro(再次,我想使用該Dropwizard-Shiro lib,因為我也很可能會將其用於我的REST端點)。

Apache Shiro有自己的過濾器類型,這些過濾器shiro.ini中配置。

例:

[urls]
/api/** = noSessionCreation, authcBasic
/views/login = authc
/views/authenticated = authc, user

配置authc篩選器以重定向到您實現的登錄表單頁面。 使用過濾器的表單參數和POST到/views/login

如果在Jetty中啟用了會話管理器,那么Shiro應該在從登錄表單頁面登錄時創建servlet會話。

請注意,我尚未實際測試此配置。

暫無
暫無

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

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