在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);
是否有任何具体的使用规则?
答案 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。