Spring Security 基于角色的授权问题
Posted
技术标签:
【中文标题】Spring Security 基于角色的授权问题【英文标题】:Spring Security role-based authorisation issue 【发布时间】:2016-07-01 21:11:23 【问题描述】:我已经在我的应用程序中实现了 Spring Security。 它是基于无状态令牌的身份验证和基于用户名/密码的身份验证。
我已配置用户身份验证,但基于角色的授权不起作用。
拥有ROLE_USER
的用户能够访问拥有ROLE_ADMIN
的控制器方法。
这是配置。
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
@Configuration
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter
@Bean
AuthenticationProvider passwordBasedAuthenticationProvider()
return new PasswordBasedAuthenticationProvider();
@Bean
AuthenticationProvider tokenBasedAuthenticationProvider()
return new TokenBasedAuthenticationProvider();
@Override
public void configure(WebSecurity web) throws Exception
web.ignoring().antMatchers("/api/v1/public/**");
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception
return super.authenticationManagerBean();
@Override
protected void configure(HttpSecurity http) throws Exception
http.
csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
and().
authorizeRequests().
anyRequest().authenticated().
and().
anonymous().disable();
http.addFilterBefore(new AuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(passwordBasedAuthenticationProvider()).
authenticationProvider(tokenBasedAuthenticationProvider());
域
@Entity
public class Role implements GrantedAuthority
private long id;
private String authority;
public class User implements UserDetails
private String username;
private String passwordHash;
private Role role;
@RestController
public class TesController
@RequestMapping(value="/authController")
@Secured("ROLE_ADMIN")
String test() return "I am secure for ROLE_ADMIN"
这个配置有什么不正确的地方?
【问题讨论】:
您的配置中实际上没有提到ROLE_USER
或ROLE_ADMIN
。我只习惯使用 XML 配置。应该在哪里定义角色,以便TesController
可以实际接他们?
如果你改变你的configure
方法,加上.antMatchers("/authController").access("hasRole('ADMIN')")
,情况是一样的吗?
【参考方案1】:
您必须至少定义 RoleHierarchie 使用类似这样的内容或任何配置在您的情况下可能看起来像:
@Bean
public RoleHierarchy roleHierarchy()
RoleHierarchyImpl r = new RoleHierarchyImpl();
r.setHierarchy("ROLE_ADMIN > ROLE_STAFF");
r.setHierarchy("ROLE_STAFF > ROLE_USER");
r.setHierarchy("ROLE_DEVELOPER > ROLE_USER");
r.setHierarchy("ROLE_USER > ROLE_GUEST");
return r;
【讨论】:
***.com/questions/6357579/…以上是关于Spring Security 基于角色的授权问题的主要内容,如果未能解决你的问题,请参考以下文章
基于 Spring Boot / Spring Security 角色的授权无法正常工作 [重复]
基于角色的授权:使用 OneLogin 和 Spring Security 的 Oauth