我已经声明了实现WebSecurityConfigurerAdapter的类。在成功的LOGIN过程之后,我将用户重定向到我在authorizeRequests内声明的页面/主/列表,并将“v_main”角色绑定到此请求URL。但是我声明的以下配置将我返回到access_denied页面,我已将其声明为accessDeniedPage
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {
protected static Logger log = Logger.getLogger(AppSecurityConfig.class);
@Autowired
private CustomAuthenticationProvider authProvider;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
log.info("configAuthentication");
auth.authenticationProvider(authProvider);
}
@Override
public void configure(WebSecurity web) throws Exception {
log.info("configure WebSecurity");
web.ignoring()
.antMatchers("/assets/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
log.info("configure HttpSecurity");
http
.formLogin()
.loginPage("/login")
.permitAll()
.loginProcessingUrl("/login")
.usernameParameter("username").passwordParameter("password")
.defaultSuccessUrl("/main/list")
.failureUrl("/login?fail=1")
.and()
.authorizeRequests()
.antMatchers("/main/**").hasRole("v_role")
.anyRequest().authenticated()
.and()
.logout()
//.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
.invalidateHttpSession(true)
.and()
.exceptionHandling()
.accessDeniedPage("/access_denied")
.and()
.csrf();
}
我的回答
我需要的是将hasRole更改为hasAuthority。
.antMatchers("/main/**").hasAuthority("v_main")
因为我正在使用SimpleGrantedAuthority设置角色
答案 0 :(得分:1)
发生此问题的主要原因是用户没有该角色 如果您打印此用户的所有角色,理想情况下会发现用户没有此角色。 您可以查看下面给出的内容
for ( GrantedAuthority ga : SecurityContextHolder.getContext().getAuthentication().getAuthorities() ) {
log.info("\t\t\t" + ga.getAuthority() + "\t" + request.isUserInRole(ga.getAuthority()));
}
更新:
如果你使用的是Spring 4,那么为了让hasRole()工作,你必须在你的角色中添加前缀ROLE_,同时添加它们,你可以使用hasAuthority()。
因此hasAuthority('ROLE_ADMIN')
表示与hasRole('ADMIN')