Spring Security:身份验证页面permitAll似乎被忽略了

时间:2017-04-19 21:01:48

标签: java spring security authentication authorization

我正在使用Spring Security编写应用程序。 我已经实现了我的自定义UserDetails,UserDetailsS​​ervice,AccessDecisionVoter和WebSecurityConfigurerAdapter。 我想允许未经授权的用户访问/authenthication/login页面进行登录,但是每个其他页面访问都需要由自定义AccessDecisionVoter处理。
我的自定义WebSecurityConfigurerAdapter类如下所示:

@Configuration
@EnableWebSecurity
@ComponentScan(value = "security")
public class Configuration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsServiceImpl;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/authentication/login**")
                .permitAll()
                .and()
            .authorizeRequests()
                .anyRequest()
                .authenticated()
                .accessDecisionManager(accessDecisionManager())
        ;
    }


    @Bean
    public AccessDecisionManager accessDecisionManager() {
        List<AccessDecisionVoter<? extends Object>> decisionVoters =
                Arrays.asList(new AccessDecisionVoterImpl());
        return new UnanimousBased(decisionVoters);
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        try {
            auth.userDetailsService(userDetailsServiceImpl);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Bean
    public UserDetailsServiceImpl userDetailsService() {
        return userDetailsServiceImpl;
    }

}

我在我的数据库中定义了几个角色。我的自定义AccessDecisionVoter中的vote方法根据该用户和URL + httpMethod检索登录的用户的权限并授予或拒绝访问权限。

问题:
但是,当我使用用户名和密码向/ authentication / login发送POST时,我的代码在自定义AccessDecisionVoter中给我一个NullPointerException:用户名(通过authentication.getPrincipal();检索返回anonymousUser,这导致后面的NullPointer但是我不明白为什么vote方法被调用,因为配置文件告诉Spring允许所有访问/ authentication / login

1 个答案:

答案 0 :(得分:0)

我相信你设置它的方式,permitAll只是让它允许所有请求(即使是未经身份验证的请求)但它不会禁用该请求的安全链,它仍会尝试通过它们进行处理所有。如果您只想绕过所有安全性,我通常使用的方法是覆盖webSecurity配置方法并在那里添加例外情况,如下所示:

@Override
public void configure(WebSecurity webSecurity) throws Exception
{
    webSecurity
        .ignoring()
        .antMatchers("/authentication/login**");
}