我正在运行一个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()
时。如果有人能指引我解释配置的细节,那将会很棒。