使用JWT和Spring时登录失败

St1id3r

我正在尝试使用JWT(使用Angular作为我的前端,并使用Spring作为后端)来设置身份验证。我具有以下用于设置JWT过滤器的AuthenticationFilter类:

package com.atlas.config;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;

public class AuthenticationFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //System.out.println("filter");
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String authHeader = ((HttpServletRequest) request).getHeader("Authorizatoin");
        //System.out.println(authHeader);
        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            throw new ServletException("Missing or invalid Authorization header.");
        }
        String token = authHeader.substring(7);

        try
        {
            //security key needs to be changed before deployment
            Claims claims = Jwts.parser().setSigningKey("feb1atlaskey").parseClaimsJws(token).getBody();
            req.setAttribute("claims", claims);
        }
        catch(SignatureException e)
        {
            throw new ServletException("Not a valid token");
        }
        chain.doFilter(req,res);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

这是我的UserController类,在其中进行登录检查和设置Auth标头:

package com.atlas.controller;

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.atlas.entity.User;
import com.atlas.service.UserService;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

@RestController
@RequestMapping("/users")
public class UserController {
    private final Map<String, List<String>> userDb = new HashMap<>();

    public UserController() {
        userDb.put("tom", Arrays.asList("user"));
        userDb.put("sally", Arrays.asList("user", "admin"));
    }

    @RequestMapping(value = "login", method = RequestMethod.POST)
    public LoginResponse login(@RequestBody final UserLogin login)
        throws ServletException {
        System.out.println("In user controller");
        if (login.name == null || !userDb.containsKey(login.name)) {
            throw new ServletException("Invalid login");
        }
        return new LoginResponse(Jwts.builder().setSubject(login.name)
            .claim("roles", userDb.get(login.name)).setIssuedAt(new Date())
            .signWith(SignatureAlgorithm.HS256, "secretkey").compact());
    }


    @Autowired
    private UserService userService;

    @RequestMapping(method = RequestMethod.POST, 
            produces = MediaType.APPLICATION_JSON_VALUE, 
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public void addUser(@RequestBody User u) {
        this.userService.addUser(u);
    }
        private static class UserLogin {
            public String name;
            public String password;
        }

        private static class LoginResponse {
            public String token;

            public LoginResponse(final String token) {
                this.token = token;
            }
        }
}

现在,当我使用简单形式进行登录并使用Angular发出POST请求时,它不会到达UserController。它到达过滤器并以“缺少或无效的授权标头”的形式抛出Servlet异常。

我还配置了我的应用程序以在链中添加此过滤器,如下所示:

package com.atlas.config;

import javax.servlet.Filter;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInit extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return new Class[]{AppConfig.class,SwaggerConfig.class,AuthenticationFilter.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        // TODO Auto-generated method stub
        return new String[] {"/api/*"};
    }

    @Override
    protected Filter[] getServletFilters() {
        Filter [] singleton = { new CORSFilter(), new AuthenticationFilter() };
        return singleton;
    }
}

我在这里缺少一些配置还是犯了一些严重的错误?任何帮助,不胜感激!

迈克尔·迪西高

“授权”标头的拼写错误:

从以下位置替换:

String authHeader = ((HttpServletRequest) request).getHeader("Authorizatoin");

至:

 String authHeader = ((HttpServletRequest) request).getHeader("Authorization");

您可以考虑将Spring Framework常量用于http标头,以避免出现此类问题:

String authHeader = ((HttpServletRequest) request).getHeader(org.springframework.http.HttpHeaders.AUTHORIZATION);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用OWIN和JWT时如何记录身份验证失败原因?

来自分类Dev

使用python和imaplib的Gmail登录失败

来自分类Dev

使用 PHP 和 MYSQLI 登录失败

来自分类Dev

使用FormsAuthentication CustomIdentity和更新AuthTicket UserData时,为什么登录重定向在MVC中失败?

来自分类Dev

使用授权代码授权和 JWT 使用 OAuth2 通过 spring boot 登录到客户端

来自分类Dev

Spring Boot登录失败

来自分类Dev

尝试使用JWT创建登录时出现“不是函数”错误

来自分类Dev

在登录时使用JWT授权,用户身份为null

来自分类Dev

无法在登录时返回jwt

来自分类Dev

Spring Security和使用Google登录

来自分类Dev

Spring Security和使用Google登录

来自分类Dev

使用MacOS终端连接到SQL Server时登录失败

来自分类Dev

使用Python连接到SQL Server时,用户“”登录失败

来自分类Dev

使用 FQDN 访问本地 Windows 10 共享时登录失败

来自分类Dev

使用 Umbraco amd MVC 在 html 登录失败时显示 div

来自分类Dev

使用Google和Spring Security和Spring Social登录

来自分类Dev

使用RestTemplate和Unwrap Root时,Spring Boot(2.3.6.RELEASE)反序列化失败

来自分类Dev

使用TestNG和Spring上下文运行测试时,自动装配失败,结果为空

来自分类Dev

使用Angular和Google Firebase的Facebook登录失败-URL被阻止

来自分类Dev

使用Ajax登录失败

来自分类Dev

Auth0和Angular 2:使用登录小部件登录和路由失败

来自分类Dev

与某些用户登录时尝试登录失败

来自分类Dev

登录失败时获得登录警报

来自分类Dev

用户 ' ' 之前登录时登录失败

来自分类Dev

使用www和不使用www时的不同登录状态

来自分类Dev

Spring Security在失败登录时返回String作为主体而不是UserDetails?

来自分类Dev

使用Spring Boot和JWT保护REST Api

来自分类Dev

处理 JWT 令牌和 cas 登录状态

来自分类Dev

使用mySQL和PHP登录时出现问题

Related 相关文章

  1. 1

    使用OWIN和JWT时如何记录身份验证失败原因?

  2. 2

    使用python和imaplib的Gmail登录失败

  3. 3

    使用 PHP 和 MYSQLI 登录失败

  4. 4

    使用FormsAuthentication CustomIdentity和更新AuthTicket UserData时,为什么登录重定向在MVC中失败?

  5. 5

    使用授权代码授权和 JWT 使用 OAuth2 通过 spring boot 登录到客户端

  6. 6

    Spring Boot登录失败

  7. 7

    尝试使用JWT创建登录时出现“不是函数”错误

  8. 8

    在登录时使用JWT授权,用户身份为null

  9. 9

    无法在登录时返回jwt

  10. 10

    Spring Security和使用Google登录

  11. 11

    Spring Security和使用Google登录

  12. 12

    使用MacOS终端连接到SQL Server时登录失败

  13. 13

    使用Python连接到SQL Server时,用户“”登录失败

  14. 14

    使用 FQDN 访问本地 Windows 10 共享时登录失败

  15. 15

    使用 Umbraco amd MVC 在 html 登录失败时显示 div

  16. 16

    使用Google和Spring Security和Spring Social登录

  17. 17

    使用RestTemplate和Unwrap Root时,Spring Boot(2.3.6.RELEASE)反序列化失败

  18. 18

    使用TestNG和Spring上下文运行测试时,自动装配失败,结果为空

  19. 19

    使用Angular和Google Firebase的Facebook登录失败-URL被阻止

  20. 20

    使用Ajax登录失败

  21. 21

    Auth0和Angular 2:使用登录小部件登录和路由失败

  22. 22

    与某些用户登录时尝试登录失败

  23. 23

    登录失败时获得登录警报

  24. 24

    用户 ' ' 之前登录时登录失败

  25. 25

    使用www和不使用www时的不同登录状态

  26. 26

    Spring Security在失败登录时返回String作为主体而不是UserDetails?

  27. 27

    使用Spring Boot和JWT保护REST Api

  28. 28

    处理 JWT 令牌和 cas 登录状态

  29. 29

    使用mySQL和PHP登录时出现问题

热门标签

归档