java - 使用 Spring 启动服务器的 Android 登录身份验证

标签 java android spring spring-boot authentication

我正在开发一个需要登录和注册的 Android 应用程序。我已经使用 java spring boot 框架创建了服务器端。注册效果很好,但我无法登录。我该如何解决?我写的代码如下:

注册服务器代码:

@PostMapping("/register")
public Person addUser(@RequestBody Person user) {
    user.setPassword(encoder.encode(user.getPassword()));
    return userService.saveUser(user);
}

登录服务器代码:

@PostMapping("/login")
public UserDetails authenticate(@RequestBody Person principal) throws Exception {
    return authService.authenticate(principal);
}

这很好用。因为如果我尝试使用 postman ,我可以很好地登录。

This is postman result

此外,在 andorid 上注册也很有效。如果我从 android 注册一个用户,它将被保存到我的数据库中,我可以使用 postman 登录该用户。

This is my db

这是我的andorid注册码:

class HttpRequestTask extends AsyncTask<Void, Void, Person> {

        @Override
        protected Person doInBackground(Void... params) {
            try {
                final String url = "myurl/register";
                RestTemplate restTemplate = new RestTemplate();
                restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
                Person person= new Person();
                person.setNome(myname);
                person.setCognome(myusername);
                person.setUsername(mynickname);
                person.setPassword(mypassword);
                person.setProfileType(myprofileType);
                return restTemplate.postForObject(url, person, Person.class);
            }

            catch(Exception e){
                Log.e("MainActivity", e.getMessage(), e);
            }

            return null;
        }
    }

而且效果很好。

这是我的安卓登录代码:

 class HttpRequestTask extends AsyncTask<Void, Void, Person> {

    @Override
    protected Person doInBackground(Void... params) {
        try {
            final String url = "myurl/login";
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
            Person person= new Person();
            person.setUsername(myusername);
            person.setPassword(mypassword);
            return restTemplate.postForObject(url, person, Person.class); 
        }

        catch(Exception e){
            Log.e("MainActivity", e.getMessage(), e);
        }

        return null;
    }
}

登录无效。

我应该为 Android 使用 Spring Boot 吗?

谁有例子吗?

提前致谢!

最佳答案

我认为您必须在 header 中发送您的身份验证 token 。这应该用这样的拦截器来完成

public class AuthInterceptor implements ClientHttpRequestInterceptor {

    public static final String TAG = "INTERCEPTOR";

    @Bean
    EgomniaLoginManager loginManager;

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

        HttpHeaders headers = request.getHeaders();
        headers.set(ACCESS_TOKEN, loginManager.getAccessToken());

        // logga request
        if (BuildConfig.DEBUG) {
            this.logRequest(request, body);
        }

        ClientHttpResponse response = execution.execute(request, body);

        // logga response
        if (BuildConfig.DEBUG) {
//            this.logResponse(response);
            // execute second time because logging consume response body
//            response = execution.execute(request, body);
        }

        return response;
    }
}

您必须将此拦截器添加到您的RestTemplate,我使用Android Annotations 来做到这一点,所以我不记得它是如何完成的

关于java - 使用 Spring 启动服务器的 Android 登录身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50098265/

相关文章:

java - 打印两次

java - 从命令行运行,名称错误

java - 强制组件从顶部堆叠,而不是垂直居中

java - 如何强制 Spring boot 的 @RequestBody 接受 XML

java - 包含来自另一个项目的包 Spring boot gradle Intellij

java - Tomcat显示404窗口

android - 将 gradle 构建工具版本升级到 3.2.1 后,React Native 签名的 apk 失败

java - Ibinder 和 JobintentService

Android 用 Emoji Fragment 替换键盘

java - Angular5中的日期格式错误