Spring安全层次结构角色系统和蚂蚁匹配器未按预期工作

时间:2016-11-18 07:15:30

标签: java spring-mvc spring-security ant authorization

我正在尝试使用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;
}

用户&amp;作用:

@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行,它就可以了。不确定我做错了什么?

1 个答案:

答案 0 :(得分:0)

对loginPage和loginProcessingUrl使用相同的url看起来像是在冒险。 我建议你改变其中一个,也许是这样的:

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