我爲Spring Web應用程序使用Spring Security的Spring-MVC。它包括用戶註冊頁面和私人用戶面板。我有它設置目前與以下網址模式:MVC攔截器vs Spring安全篩選器vs其他...?
whatever/myapp/login
用戶登錄whatever/myapp/register?step=1
開始登記whatever/myapp/account/**
私人領域的意見(頁),而註冊後進程完全顯示whatever/myapp/pending
視圖whatever/myapp/blocked
賬戶被阻止的視圖whatever/myapp/register/retry
如果註冊失敗, llow重試
從本質上講,下面這些URL應該要求用戶身份驗證,即需要登錄:
whatever/myapp/account/**
(私人區域頁)whatever/myapp/pending
(此頁有一個計時器設置爲重定向到/帳號/家)whatever/myapp/register/retry
這是非常簡單交流請使用Spring安全性。但是,無論用戶通過Spring安全性進行身份驗證,根據用戶的當前帳戶狀態(存儲在我的數據庫中),私人區域頁面都應該可訪問或不可訪問。
更具體地說:如果用戶嘗試訪問私人區域(/account/**
)中的任何內容,則應根據狀態顯示適當的視圖(重定向到適當的頁面)。我已經定義了這些狀態:
suspended
- 涉及未決視圖enabled
- 允許完全訪問disabled
- 在這裏retry_allowed
無關 - 涉及重試視圖blocked
- 涉及到賬戶封鎖視圖
目前,我有一個MVC攔截器設置爲/account/**
,它檢查用戶狀態並重定向到適當的頁面,但不知何故,我覺得這不是真正的理想或適當的解決方案,因爲我面臨奇怪的行爲,如多個控制器調用。 ..我也不太確定何時返回true
/false
內preHandle()
方法。以下是攔截器的代碼片段:
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object arg2)
throws Exception {
IPanelUser pUser = (IPanelUser) SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
// check principal first and then load from DB
// "suspended" is initial status upon registration
if(pUser.getCustomer().getStatus() == CustomerStatus.Suspended.getCode()) {
// if suspended, load from DB and update status
Customer customer = this.customerService.getUserByUsername(pUser.getUsername());
if(customer != null)
pUser.getCustomer().setStatus(customer.getStatus());
// still suspended? redirect to pending
if(pUser.getCustomer().getStatus() == CustomerStatus.Suspended.getCode()) {
response.sendRedirect("../pending");
return false;
}
}
if(pUser.getCustomer().getStatus() == CustomerStatus.Blocked.getCode()) {
// redirect to blocked page
response.sendRedirect("../blocked");
SecurityContextHolder.clearContext();
return false;
}
if(pUser.getCustomer().getStatus() == CustomerStatus.AllowRetry.getCode()) {
// redirect to CC submission page
response.sendRedirect("../register/retry");
return false;
}
if(pUser.getCustomer().getStatus() == CustomerStatus.Enabled.getCode() ||
pUser.getCustomer().getStatus() == CustomerStatus.Disabled.getCode()) {
// do nothing
}
return true;
}
。
這是一個有效的方法嗎?有其他建議嗎?