2013-05-11 59 views
2

在我的Web應用程序中,我有一個結帳過程,用戶可以決定是否要登錄。這個過程是一樣的,但是登錄過程中的數據會被預填充。在JSF中可選登錄

購物車 - >繼續有/無登錄 - >結賬

我知道如何「安全」與容器管理的登錄特定網頁,但如何我實施「可選登錄」?我長時間搜索了互聯網,但只找到了登錄的常規方法,不幸的是並不是我所需要的。

有沒有辦法通過追加查詢字符串的行動方法的返回值?

public String withLogin() { 
    return "checkout.xhtml?login=true"; 
} 

public String noLogin() { 
    return "checkout.xhtml"; 
} 

任何幫助和想法表示讚賞。


解決方案:基於kolossus的回答

,我發現我的解決方案。 authenticate-Method是我需要的,但沒有找到。

因此,我實現了一個WebFilter,它根據url paramater login = true進行身份驗證,如上所述我從ManagedBean返回。

@WebFilter("/order/checkout.xhtml") 
public class LoginFilter implements Filter{ 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest req = (HttpServletRequest) request; 
     if(("true").equals(req.getParameter("login"))) { 
      req.authenticate((HttpServletResponse) response); 
     }  
     chain.doFilter(request, response);  
    } 

    // init and destroy Method 
} 

雖然kolossus說,人們不應該顯示在URL中的「登錄選項」(我部分同意),我用這種方式,無論如何,因爲如果他要對自己的登錄或沒有用戶可以自行決定(通過點擊不同的按鈕),這不是一個安全問題。

回答

2

返回「checkout.xhtml?login-needed = true」;.

不這樣做。不要。您希望以可閱讀文本的形式顯示在URL中的最後一件事是用於登錄或不登錄的選項。你的情況

可選登錄意味着兩件事情:

  1. 從您的應用程序
  2. 使用Servlet 3.0's programmatic login手動管理結賬頁面認證的全球安全領域卸下結帳頁面。編程登錄提供了以下方法來處理身份驗證

    • login()將允許你手動供用戶憑據到您配置的領域。藉此,您可以在目標頁面上的preRenderView事件中執行身份驗證。

    • authenticate()將允許您使用<form-login-config>中的配置表格執行檢查。不足之處(IMO)認爲這在JSF之外最好,在Filter中很可能。

因此,從安全性約束消除結帳可讓您手動根據某些條件進行身份驗證。

剩下的唯一問題是如何與結賬頁面進行通信,以驗證是否需要驗證。您需要想出一個更具創造性的方式,可能會將不可讀的值散列到GET請求中以表示登錄狀態。絕對不要只說 「登錄= YES」

在你的問題的情況下,這些也可能會感興趣

+0

謝謝你的答案。但是,爲什麼我不應該顯示「url = true」在url中?用戶可以決定是否他想要登錄,所以它使差異... – Manuel 2013-05-12 08:30:06

+0

@曼努埃爾,我不是說用戶不應該通過點擊不同的按鈕來決定他的偏好,我所說的是您選擇的參數名稱在瀏覽器的地址欄中是可讀的,並將您的實施細節暴露給肉眼。我在這裏推薦你混淆參數名稱和值,以便普通用戶無法理解它。將一些變量放入一個看起來沒有意義的參數中,看起來像「rand = r234u2yf9393yyry3aa1kv」對用戶來說是沒有意義的,他們不太可能想要篡改認證機制 – kolossus 2013-05-12 15:04:30

0

我會考慮使用spring security併爲匿名用戶授予訪問您的頁面的權限。然後hide特定組件,如果用戶是匿名的。

+0

謝謝您回答,但我認爲你理解我錯了。我會讓用戶決定他是否想要登錄,如果他想登錄(並在登錄到他想去的頁面後重定向),則顯示登錄表單。此外,不幸的是,它不可能在我們的項目中使用彈簧... – Manuel 2013-05-11 13:23:47

+0

好吧,我以爲你想擴展功能,如果用戶登錄。 – dratewka 2013-05-11 13:37:11