我使用以下配置为表单登录开发了一个简单的Spring引导程序和spring安全性
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**", "/registration").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
http.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
}
我还创建了自定义userDetailsService实现来获取用户。
现在,当我使用登录表单从网页登录时,我能够成功登录并能够访问受保护的端点(在随后的响应中,我也能看到JSESSIONID。
但是,当我尝试使用具有url:http://localhost:9090/login的httpPost通过其他服务(Android应用程序)登录时,我可以看到该用户已通过身份验证。
但是我无法从android应用访问安全的端点。响应返回一个HTML
字符串(登录页面数据)。
我也看不到响应中的JSESSIONID
。
总体而言,我的配置在网页上运行正常,但无法从其他api上正常运行。
答案 0 :(得分:0)
当您使用网页登录表单时,它可以工作,因为您的UI和服务器位于同一域中。当Spring Security对用户进行身份验证时,我相信它会在cookie标头中添加一个会话ID,以便它能够在登录后对每个请求进行身份验证。当从另一个域(在本例中为您的Android App)访问您的Spring API时,它不再位于同一域中,因此Spring Security不会将会话ID添加到Cookie标头中。因此,要做您想做的事情,我相信您必须编写自己的身份验证过滤器才能向请求中添加Cookie或标头。这是一个使用JSON Web令牌通过Spring Boot认证api的链接。 https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/