2013-09-30 146 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