春季启动和安全性:从android应用访问安全的URL。

时间:2018-09-06 17:22:41

标签: web-services spring-boot spring-security

我使用以下配置为表单登录开发了一个简单的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());
    }

我还创建了自定义userDetailsS​​ervice实现来获取用户。

现在,当我使用登录表单从网页登录时,我能够成功登录并能够访问受保护的端点(在随后的响应中,我也能看到JSESSIONID。

但是,当我尝试使用具有url:http://localhost:9090/login的httpPost通过其他服务(Android应用程序)登录时,我可以看到该用户已通过身份验证。 但是我无法从android应用访问安全的端点。响应返回一个HTML字符串(登录页面数据)。

我也看不到响应中的JSESSIONID

总体而言,我的配置在网页上运行正常,但无法从其他api上正常运行。

1 个答案:

答案 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/