2013-09-30 148 views
1

我想了解一些Spring安全代碼。我是Spring Security的新手,我想我在這裏缺少一些基本的東西。@PreAuthorize安全角色註釋

我上了班的一個註解:

@Controller 
@RequestMapping("/download-resource") 
@PreAuthorize(value="hasRole('LINKS_ADMIN')") 
public class DownloadResourcesController extends BaseHtmlController 
{..} 

我看了一下@PreAuthorize和它的邏輯。 我仍然無法理解Spring安全檢索定義的角色字符串的位置:'LINKS_ADMIN'。它在哪裏定義?

謝謝, 射線。

+1

它可以是任何你想要的......這些是在你的應用程序中使用的角色,可以由你選擇。通常它們被分配給用戶。 –

+0

但是我看了整個項目的這個詞 - 'LINKS_ADMIN。無法找到它的任何聲明。 – rayman

+0

用戶具有角色,彈簧安全檢查這些角色。 '@ PreAuthorize'標籤內的內容是用於檢查當前用戶的元數據。如果用戶不具有該角色,則拒絕訪問。沒有編譯時檢查運行時,如果你沒有在你的系統中的角色編譯和部署好,但沒有人可以訪問。 –

回答

3

這些角色是您在用戶登錄時分配給UserDetails的角色(權限)。這些將由Authentication實施返回。

它們是一種形式Collection<? extends GrantedAuthority>,通常使用SimpleGrantedAuthority

例如,在我的應用程序中,每個人都被分配到組。所以當用戶登錄時,我會檢查用戶所屬的所有組,並將其添加到他的用戶詳細信息中。

for (Group group : groups) { 
     grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_" + group.getName().toUpperCase())); 
    } 

所以,如果我有一個名爲「管理員」,「用戶」和組「記者:」我現在可以檢查has_role('ROLE_ADMIN')has_role('ROLE_USER')has_role('ROLE_REPORTER')

 

引擎蓋下它是從檢索

SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 

其中getAuthentication()返回與上面鏈接的認證I的實例,你從這個對象中獲取權限。

+1

需要注意的是,這些角色名稱最好在編譯時常量中定義,比如不同'Role'類的子類中的'public static final String',或者'enum'值。這可以防止字符串拼寫錯誤造成很多麻煩。 – chrylis

+1

@chrylis是的,有一個'stringly typed'應用程序可能會導致一些錯誤。理想情況下,權威機構也不會直接以團體名稱爲基礎,因爲它們會發生變化,並且很難延長訪問時間。擁有可以授予組的「特權」通常會更好,並且將其作爲代碼中的常量。 – Matsemann

+0

我有一個包含LINKS_ADMIN角色的枚舉類。但春天安全如何鏈接?它在哪裏定義?我編輯了我的問題 – rayman