spring使用jwt引导,登录请求返回userdetailsserviceimpl对象,而不是jtw令牌

jckbn6z7  于 2021-07-23  发布在  Java
关注(0)|答案(0)|浏览(165)

几天前我就开始工作了,我忘了我做了什么改变/更新了什么。
我试图对featchjwt令牌执行/login请求,但是它返回userdetailsserviceimpl对象,我将authfilter设置为/login;
我从/login请求获取的对象(返回userdetailsserviceimpl.loaduserbyusername(user.getemail())

{
    "password": "$2a$10$SfCMqNdUbSOi.LbbfJrntu70IqEBTnm6NVjHjLXblgH6rHd8dG.cW",
    "username": "ido@hornstienas.com",
    "authorities": [],
    "accountNonExpired": true,
    "accountNonLocked": true,
    "credentialsNonExpired": true,
    "enabled": true
}

这些是我的课程:
我的主控制器:

@RestController
public class MainController {

@Autowired
private UserRepo userRepo;
@Autowired
private SpecialsRepo specialsRepo;
@Autowired
private ProductRepo productRepo;
@Autowired
private PaypalTransactionRepo paypalTransactionRepo;
@Autowired
private UserDetailsServiceImpl userDetailsServiceImpl;

private BCryptPasswordEncoder bCryptPasswordEncoder;

public MainController(UserRepo userRepo,
        BCryptPasswordEncoder bCryptPasswordEncoder) {

this.userRepo = userRepo;
this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}

    @PostMapping
    (value = "/signup")
    public ResponseEntity<Object> createCustomer(@RequestBody models.User user) {

    System.out.println("Incoming object - "+ user.toString());

    //Customer cm1 = customerRepository.findByEmail(customer.getEmail());

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");  
        String now = LocalDateTime.now().format(dtf);  

        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword().toString()));

        System.out.println(user.getPassword());

        user.setDateCreated(now.toString());

        user.setRole("USER");

        userRepo.save(new models.User(user));   

        return ResponseEntity.status(HttpStatus.CREATED).body(null);

    //repository.save(new Customer(customer.email,customer.password,customer.firstName,customer.lastName));
    }

    @PostMapping
    (value = "/adminsignup")
    public ResponseEntity<Object> createAdmin(@RequestBody models.User user) {

    System.out.println("Incoming object - "+ user.toString());

    //Customer cm1 = customerRepository.findByEmail(customer.getEmail());

         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");  
         String now = LocalDateTime.now().format(dtf);  

         user.setPassword(bCryptPasswordEncoder.encode(user.getPassword().toString()));

        System.out.println(user.getPassword());

        user.setDateCreated(now.toString());

        userRepo.save(new models.User(user.getEmail(),user.getPassword(),now,"ADMIN")); 

        return ResponseEntity.status(HttpStatus.CREATED).body(null);

    //repository.save(new Customer(customer.email,customer.password,customer.firstName,customer.lastName));
    }

    @PostMapping(
    value = "/login")
    public UserDetails login(@RequestBody models.User user) {

    return userDetailsServiceImpl.loadUserByUsername(user.getEmail());
}

这是我的userdetailsserviceimpl类:

public class UserDetailsServiceImpl implements UserDetailsService {
    private UserRepo userRepo;

    public UserDetailsServiceImpl(UserRepo userRepo) {
        this.userRepo = userRepo;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        models.User user = userRepo.findByEmail(username);
        if (user == null) {
            throw new UsernameNotFoundException(username);
        }
        return new User(user.getEmail(), user.getPassword(), emptyList());
    }
}

这是我的authfilters:

public static final String SECRET = "SecretKeyToGenJWTs";
    public static final long EXPIRATION_TIME = 864000000; // 10 days
    public static final String TOKEN_PREFIX = "Bearer ";
    public static final String HEADER_STRING = "Authorization";
    public static final String SIGN_UP_URL = "/signup";

    private AuthenticationManager authenticationManager;
    @Autowired
    private UserRepo userRepo;

    public AuthFilter(AuthenticationManager authenticationManager,UserRepo userRepo) {
        this.authenticationManager = authenticationManager;
        this.userRepo =  userRepo;

        setFilterProcessesUrl("/login"); 
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
                                                HttpServletResponse res) throws AuthenticationException {

        try {
            models.User creds = new ObjectMapper()
                    .readValue(req.getInputStream(), models.User.class);

            return authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            creds.getEmail(),
                            creds.getPassword())
            );
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest req,
                                            HttpServletResponse res,
                                            FilterChain chain,
                                            Authentication auth) throws IOException {

        //System.out.println("Request "+req.getInputStream().toString());

        models.User user = userRepo.findByEmail(((User) auth.getPrincipal()).getUsername());

        System.out.println("Will this work? "+user.toString());

        String token = JWT.create()
                .withSubject(((User) auth.getPrincipal()).getUsername())
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .sign(Algorithm.HMAC512(SECRET.getBytes()));

        String body = token;

        System.out.println("THis is token - "+token);

        res.getWriter().write(body);
        res.getWriter().flush();
    }
}

另一个筛选器:

public static final String SECRET = "SecretKeyToGenJWTs";
    public static final long EXPIRATION_TIME = 864000000; // 10 days
    public static final String TOKEN_PREFIX = "Bearer ";
    public static final String HEADER_STRING = "Authorization";
    public static final String SIGN_UP_URL = "/signup";

    public JWTAuthFilter(AuthenticationManager authManager) {
        super(authManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest req,
                                    HttpServletResponse res,
                                    FilterChain chain) throws IOException, ServletException {

        System.out.println("Filtering tright now");

        String header = req.getHeader(HEADER_STRING);

        if (header == null || !header.startsWith(TOKEN_PREFIX)) {
            chain.doFilter(req, res);
            return;
        }

        UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

        SecurityContextHolder.getContext().setAuthentication(authentication);
        chain.doFilter(req, res);
    }

    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
        String token = request.getHeader(HEADER_STRING);
        if (token != null) {
            // parse the token.
            String user = JWT.require(Algorithm.HMAC512(SECRET.getBytes()))
                    .build()
                    .verify(token.replace(TOKEN_PREFIX, ""))
                    .getSubject();

            if (user != null) {
                return new UsernamePasswordAuthenticationToken(user, null);
            }
            return null;
        }
        return null;
    }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题