如何解决Spring Security中的角色?

我正在尝试在我的项目中使用Spring Security,这里是代码:

@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // TODO Auto-generated method stub //super.configure(auth); //auth.inMemoryAuthentication().withUser("admin").password("1111").roles("USER"); auth .jdbcAuthentication() .dataSource(dataSource) .usersByUsernameQuery("select username, password, 1 from users where username=?") .authoritiesByUsernameQuery("select users_username, roles_id from roles_users where users_username=?") .rolePrefix("ROLE_"); } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable(); http .httpBasic(); http .authorizeRequests() .anyRequest().authenticated(); http .authorizeRequests() .antMatchers("/users/all").hasRole("admin") .and() .formLogin(); http .exceptionHandling().accessDeniedPage("/403"); } 

这是问题所在:

想象一下,我们的数据库中有两个用户(一个具有user角色,另一个具有admin角色),一个管理员,第二个是用户,问题是当我以用户身份连接时(只有user角色)它可以访问管理资源(这不是预期的行为)。

我认为这个查询中的问题:

 "select username, password, 1 from users where username=?" 

根据username是主键?

如果有人知道如何解决这个问题?

始终应用您的第一个匹配器anyRequest() ,因为匹配器的顺序很重要,请参阅HttpSecurity#authorizeRequests

请注意,匹配器按顺序考虑。 因此,以下内容无效,因为第一个匹配器匹配每个请求,并且永远不会到达第二个映射:

 http.authorizeRequests().antMatchers("/**").hasRole("USER").antMatchers("/admin/**") .hasRole("ADMIN") 

您修改和简化的配置:

 @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .httpBasic() .and() .authorizeRequests() .antMatchers("/users/all").hasRole("admin") .anyRequest().authenticated() .and() .formLogin() .and() .exceptionHandling().accessDeniedPage("/403"); } 

问题在于配置HttpSecurity时规则的排序。 发生的事情是当请求进入并命中时

 authorizeRequests().anyRequest().authenticated() 

并且由于用户已经过身份validation,因此从未进行过身份validation

 .antMatchers("/users/all").hasRole("admin") 

以下是如何配置它的示例:

 @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .httpBasic() .and() .authorizeRequests() .antMatchers("/public").permitAll() .antMatchers("/user").hasRole("USER") .antMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .and() .exceptionHandling().accessDeniedPage("/403"); } 

它使用责任链模式。 它将通过规则链直到找到匹配的规则。 永远不会达到匹配规则之后的任何规则。 通常,在为经过身份validation的请求编写规则时,将首先使用更具体的规则。