Spring安全分级角色系统和蚂蚁匹配器没有按预期工作



我正试图通过使用ant匹配器来保护我的web应用程序的部分,并且还配置了分层角色。下面是我的安全配置:

角色层次结构:

private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
    DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
    defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
    return defaultWebSecurityExpressionHandler;
}

@Bean
public RoleHierarchyImpl roleHierarchy(){
    RoleHierarchyImpl hierarchy = new RoleHierarchyImpl();
    hierarchy.setHierarchy("SUPER_ADMIN > ADMIN ADMIN > PATIENT");
    return hierarchy;
}

用户,角色:

@Autowired
public void configureAuthentication(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser("rakesh").password("rakesh").roles("PATIENT");
    auth.inMemoryAuthentication().withUser("root").password("root").roles("ADMIN");
    auth.inMemoryAuthentication().withUser("notroot").password("notroot").roles("SUPER_ADMIN");
}

请求授权:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()
            .loginPage("/web/login")
            .loginProcessingUrl("/web/login")
            .usernameParameter("username").passwordParameter("password")
            .defaultSuccessUrl("/web/patient/home")
            .and()
        .authorizeRequests()
            .expressionHandler(webExpressionHandler())
            .antMatchers("/web/patient/add*").access("hasRole('ADMIN')")
            .antMatchers("/web/patient/home").access("hasRole('PATIENT')")  // home URL
            .antMatchers("/allpatients").access("hasRole('ADMIN')")
            .antMatchers("/web/**").permitAll()
            .and()
        .httpBasic()
            .realmName(env.getRequiredProperty("basicauthentication.realm"))
            .authenticationEntryPoint(getBasicAuthEntryPoint())
            .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .exceptionHandling()
            .accessDeniedPage("/web/accessdenied")
            .and()
        .csrf().disable();
}

通过上述设置,没有一个用户能够登录,他们被返回到登录页面。如果我注释掉authorizeRequest中的home URL行,它就可以工作了。不确定我做错了什么?

为loginPage和loginProcessingUrl使用相同的url对我来说很奇怪。我建议您更改其中一个,也许像这样:

.formLogin()
            .loginPage("/web/login")
            .loginProcessingUrl("/web/performLogin")

相关内容

  • 没有找到相关文章

最新更新