WebSecurityConfigurerAdapter配置无法正确处理请求

时间:2017-10-18 06:21:36

标签: spring-mvc spring-security

我已经声明了实现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设置角色

1 个答案:

答案 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')

相同