2010-06-29 47 views
2

我還在研究我的第一個Grails應用程序。這一次,我的問題是限制特定用戶訪問某些操作。Grails - 只能訪問對象的所有者

假設用戶添加一些對象,例如,圖書。我想授予訪問權限,只允許管理員和添加圖書的用戶編輯圖書。我目前正在使用Acegi插件。我知道該插件有更新的版本,但我不確定它是否會改變我的問題。

第二件事是某種類似的。我有一個邊欄,有「Hello $ {currentUser.username}。currentUser是一個返回當前登錄用戶的實例的方法。但問題是,我不知道我可以在哪裏放置此消息在任何地方都可以使用它,我應該把它放在一些服務中,並將它包含在任何地方嗎?我嘗試創建一個由所有其他控制器擴展的ApplicationController,但似乎並不奏效。謝謝! Grzegorz

回答

5

你應該使用更新的Spring Security Core插件,因爲它有一個ACL附加插件,它完全符合你的需求。詳情請參閱http://grails.org/plugin/spring-security-acl

對於第二個問題,這裏有一個taglib。在Acegi的插件使用:

Hello <g:loggedInUserInfo field="username"/>

(見http://www.grails.org/AcegiSecurity+Plugin+-+Artifacts)和Spring Security的核心插件使用:

Hello <sec:username/>

(見http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/ 「安全標籤」 一節)

+0

哦,是的,我怎麼會錯過有關標籤的信息......謝謝。 我會盡快切換到新的插件,我希望它會方便管理用戶權限 – arnvald 2010-06-29 18:55:55

2

對於ROLE訪問,您只需指定特定URL的特定ROLE可以訪問該操作即如果您使用的是插件的RequestMap方法如果您使用註釋方法,只需在控制器中註釋該操作:

@Secured([「WHATEVER_ROLE」])

至於只允許誰創造了本書編輯的用戶,你可以拉動用戶域進行認證與authenticateService.userDomain(),然後您可以將該用戶與創建該書籍的用戶進行比較(假設您在Book域上有某種類型的createdBy屬性。

def loggedInUser = authenticateService.userDomain() 
if (book.createdBy.equals(loggedInUser)) { 
    // allow editing 
} 

這樣的事情,無論如何。

+0

Thans for response!現在問題是我可以在哪裏獲取當前用戶,以便我可以在任何地方使用此用戶的數據。例如,我希望在頁面頂部看到登錄的用戶登錄信息,而不管哪個控制器正在採取行動。我需要在每個控制器中定義它嗎? – arnvald 2010-06-29 18:42:32