2012-04-05 72 views
1

我在項目中使用Grails安全插件。我正在使用控制器操作上的註釋來限制對'ROLE_ADMIN'或'ROLE_USER'等特定類用戶的訪問。在Grails中保護用戶的控制器操作

(以此作爲我在做什麼的基礎:http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/5%20Configuring%20Request%20Mappings%20to%20Secure%20URLs.html#5.1%20Defining%20Secured%20Annotations

我的問題是,如何限制一個動作,使用戶只能看到有關自己的信息。舉例來說,可以說,我有ID的用戶= 1。如果我有一個顯示在關於用戶的信息的操作:

mySite/User/Show/1 

我怎麼防止這種能夠獲得與ID = 1相同的用戶

mySite/User/Show/2 

?有沒有簡單的方法來做到這一點?

回答

1

,如果你想同樣的邏輯也適用於多個動作

class SomeController { 

def beforeInterceptor = [action: this.&checkUser ] 

    def springSecurityService 

def checkUser() { 
    User user = User.get(params) 
     User logged = User.get(springSecurityService.principal.id) 
     if (user.id != logged.id) { 
    { 
     redirect(action: "accessDenied", controller='access' id: params.long("id")) //re-direct accessDenied page 
    return false 
    } 
    return true; 
} 

}

Class AccessController{ 
    def accessDenied= { 

     render(view: "accessDenied") 

    } 
} 
您還可以使用Grails的控制器攔截
0

你在問什麼是你商業規則的一部分。所以你應該在你的代碼中處理這些場景,而不是尋找一些插件或幫手代碼。

你可以做的是確保訪問用戶詳細信息的用戶的id與用戶的詳細信息相同。

您也可以在對象級別進行此檢查,但這將意味着對數據庫的額外查詢以獲取用戶詳細信息。

希望這會有所幫助。

1

會有什麼用problenm以下?:

class SomeController { 
    springSecurityService 
    // other stuf ... 
    def show() { 
     User user = User.get(params) 
     User logged = User.get(springSecurityService.principal.id) 
     if (user.id != logged.id) { 
      flash.message = "You can't see the profile of other users" 
      redirect action:"list" // You can redirect to other controller/action 
      return //Since grails 2 this is needed 
     } 
     // Logic for display your user 
    } 
    // other stuf ... 
} 
+0

沒有問題,我只是認爲,因爲這是一個普遍的情況下,會有一個「正確」的方式來做到這一點。 – systemoutprintln 2012-04-06 02:02:55

0

我必須同意您正在嘗試使用安全方面實施業務規則。如果用戶創建了某種文檔,那麼您將不會使用授權來選擇他們的個人資料頁面上顯示的內容,對嗎?

您必須在授權方面到達的位置和業務規則的起始位置畫一條線。

根據我的經驗,爲避免模糊線條,我總是使用授權角色作爲與一組功能相關的用戶類型。特定的用戶類型可以訪問一系列故事或用例。這些用例受限於特定的角色。

如果你開始問數據可見性問題(什麼是隱藏在頁面上,這取決於任何商業因素),那麼你應該避開你的安全框架的

+0

但是,您可能想看看hibernate-filter插件。我認爲這個插件解決了你關心的通過聲明來限制通過GORM獲得的對象:http://grails.org/plugin/hibernate-filter。這裏有一些例子可以做類似於你想要的東西:http:// jira。 grails.org/browse/GPHIBERNATEFILTER-1 – loteq 2012-04-11 13:33:00

0

我會不同意,你需要重新定義你的業務邏輯與安全邏輯。這是一個常見的用例,授權應該覆蓋它。這就是爲什麼Grails有過濾器。使用授權過濾器添加如下功能:

class AuthorizationFilters { 
    def filters = { 
     userCheck(controller: 'user', action: '*') { 
      before = { 
       // Check current user id is param.id here 
      } 
     } 
    } 
} 

因此,您的安全邏輯位於您的控制器之外。您可以添加其他控制器(如果它們傳遞用戶標識),甚至可以添加其他方法來檢查域類是否由當前用戶擁有。

相關問題