配置Spring Security无法按预期工作

时间:2018-04-24 14:52:28

标签: spring spring-boot spring-security

我正在运行一个Spring Boot应用程序,它运行一个部署为静态资源的vuejs前端和一个由Spring管理的API。我正在设置身份验证,方案就是这样。

前端应用程序位于/app,但/仍由Spring重定向到/app。我希望我的应用程序在' / login'上进行基于表单的登录。我的应用使用了Spring提供的API,API位于/api。因此,我希望API能够通过前端识别登录的会话。但是,我还希望API经过Basic身份验证。同时,我不希望除/api之外的任何路由进行基本身份验证,即使我提供身份验证标头,它仍应将我重定向到/login。所以,

  • /api基本和基于会话的身份验证
  • /**仅通过表单进行基于会话的身份验证

我正在使用当前代码:

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Value("${ldap.urls}")
    private String ldapUrls;

    @Value("${ldap.base.dn}")
    private String ldapBaseDn;

    @Value("${ldap.username}")
    private String ldapSecurityPrincipal;

    @Value("${ldap.password}")
    private String ldapPrincipalPassword;

    @Value("${ldap.user.dn.pattern}")
    private String ldapUserDnPattern;

    private AuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    public SecurityConfig(AuthenticationEntryPoint authenticationEntryPoint) {
        super();
        this.authenticationEntryPoint = authenticationEntryPoint;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .and()
            .httpBasic()
                .authenticationEntryPoint(authenticationEntryPoint)
                .and()
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout")
                .invalidateHttpSession(true);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication()
                .contextSource()
                .url(ldapUrls + ldapBaseDn)
                .managerDn(ldapSecurityPrincipal)
                .managerPassword(ldapPrincipalPassword)
                .and()
                .userDnPatterns(ldapUserDnPattern);
    }
}

这不能完全按预期工作。我的API通过Basic和Session令牌进行身份验证,但我的应用也是如此。即我可以在Postman中发送GET请求以及基本身份验证标头,并返回HTML到我的主页。

除此之外,我不认为我很好地理解配置设置是如何完成的,尤其是使用and()时。如果有人能指引我解释配置的细节,那将会很棒。

0 个答案:

没有答案