2012-08-15 86 views
1

我有一個Web應用程序,它包含一個REST API,客戶端應用程序與/生活在一起。當用戶會話超時並且客戶端js應用程序向REST API發出請求時,該請求將觸發登錄事件。一旦用戶登錄,用戶就會被帶到只顯示JSON響應的REST API端點。我想硬連線登錄頁面始終重定向到/已存在觸發登錄的請求,總是重定向到`/`

編輯1:我使用openid插件的spring-security-core插件以及grails 2.0.4。

編輯2:所以我設法得到一個解決方案的工作,但它有點粗俗,我想知道是否有一個更優雅的解決方案。

grails-app/conf/LoginRedirectFilters.groovy創建了一個簡單的過濾器:

class RedirectLoginFilters { 
    def filters = { 
     redirectAfterLogin (uri: '/api/*') { 
      before = { 
       if (session["LOGGING_IN"]) 
        redirect uri: "/" 
      } 
      after = { 
       if (session["LOGGING_IN"]) 
        session["LOGGING_IN"] = false 
      } 
     } 
    } 
} 

在我auth功能OpenIdController.groovy裏我加了會議標誌LOGGING_IN

def auth = {                      

    def config = SpringSecurityUtils.securityConfig            

    if (springSecurityService.isLoggedIn()) {              
     redirect uri: config.successHandler.defaultTargetUrl          
     return                     
    }                        

    session["LOGGING_IN"] = true 
    . 
    . 
    . 

這是通過只檢查是否正常工作LOGGING_IN當api端點被調用時該標誌爲真,並且它在一個請求後也會終止該標誌,所以它不會干擾隨後的客戶端api調用。我意識到這是相當複雜的,所以如果有更好的解決方案,請讓我知道,謝謝!

+0

您是否使用AJAX請求登錄? – 2012-08-16 16:25:05

+0

沒有隻是標準登錄,現在是。切換到AJAX登錄系統無疑將解決這個問題,但是現在這是一個後門功能。 – 2012-08-16 20:05:41

回答

0

爲什麼不能在過濾器中使用相同的「springSecurityService.isLoggedIn()」?我很確定這也適用。

0

我想我誤解正是你想要達到的目標,但如果你總是希望在成功登錄後重定向到「/」,只需在您的Config.groovy設置這些屬性:

grails.plugins.springsecurity.successHandler.alwaysUseDefault = true 
grails.plugins.springsecurity.successHandler.defaultTargetUrl = "/" 

如果您想要不同的行爲,你必須充實你的問題。

+0

彼得,我確實得到了這些設置,但由於某種原因,它們不會生效。我認爲它是因爲我使用了openid安全性插件。我想我已經找到了一個工作,在我失業後我會詳細說明這個工作。 – 2012-08-20 21:33:03