我什么时候应该使用Spring Security加入ROLE_?

时间:2017-02-09 20:19:57

标签: java spring spring-security

在Spring Security中,何时添加"ROLE_"前缀是否合适?在使用@PreAuthorize("hasRole('ROLE_USER')")的示例中,确实如此。但在这个例子中,它没有:

http
    .httpBasic()
    .and()
    .authorizeRequests()
    .antMatchers(HttpMethod.POST, "/books").hasRole("ADMIN")

以下情况如何?

SecurityContext securityContext = new SecurityContextImpl();
final Properties users = new Properties();
users.put("joe","secret,ADMIN,enabled");            <-- here
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(users);

Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));         <-- here
AnonymousAuthenticationToken anonymousAuthenticationToken = new AnonymousAuthenticationToken("test", manager.loadUserByUsername("joe"), grantedAuthorities);
        securityContext.setAuthentication(anonymousAuthenticationToken);
        SecurityContextHolder.setContext(securityContext);

是否有任何具体的使用规则?

1 个答案:

答案 0 :(得分:4)

自动ROLE_前缀

正如Spring Security 3.x to 4.x migration guide所述:

  

Spring Security 4会自动为任意角色添加前缀ROLE_。该   更改是SEC-2758

的一部分

话虽如此,以下注释中的ROLE_前缀是多余的:

@PreAuthorize("hasRole('ROLE_USER')")

由于您正在调用hasRole方法,因此隐含了您传递角色这一事实。以下表达式也是如此:

antMatchers(HttpMethod.POST, "/books").hasRole("ADMIN")

但是对于:

new SimpleGrantedAuthority("ROLE_ADMIN")

由于这是一个权威,而不是一个角色,你应该添加ROLE_前缀(如果你的意图是创建一个角色!)。调用public InMemoryUserDetailsManager(Properties users)构造函数也是如此,因为它使用了权限internally