ClassCastException - Spring Security с пользователем - PullRequest
0 голосов
/ 19 апреля 2020

Я сейчас создаю приложение для электронной коммерции и пытаюсь добавить функцию «Добавить в корзину». Я еще не работал с httprequests, поэтому каждый должен войти в систему, прежде чем получить доступ к сайту.

Когда пользователь входит в систему, переходит на домашнюю страницу и пытается добавить продукт в корзину, он отправит сообщение Просьба добавить этот продукт.

    @PostMapping("/cart/{id}")
public String addProduct(@PathVariable Long id, @ModelAttribute("cartItem") CartItems cartItem, Model model) {
    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    User user = ((User) principal);

        Optional<Product> product = productService.findById(id);
        cartItem.setProduct(product.get());
        cartItem.setPrice(cartItem.getQuantity() * cartItem.getProduct().getPrice());

        user.getCart().getCartItems().add(cartItem);

        return "redirect:/cart";
   }

Класс пользователя:

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "users")
public class User implements Serializable, UserDetails 
{

private static final long serialVersionUID = -8903772563656397127L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;

@Column(name = "username")
private String username;

@Column(name = "email")
private String email;

@Column(name = "password")
private String password;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@OneToOne(mappedBy = "user")
private Cart cart;

@Column(name = "address")
private String address;

ДЕТАЛИ ПОЛЬЗОВАТЕЛЯ:

    @Override
@Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = userService.findByUsername(username);

    Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
    grantedAuthorities.add(new SimpleGrantedAuthority("UNDEFINED"));

    return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities);
}

Проблема заключается в приведении класса пользователя к объекту субъекта из данных пользователя. Я получаю следующую ошибку:

java .lang.ClassCastException: класс org.springframework.security.core.userdetails.User не может быть приведен к классу com.nickjojo.ecomapp.entity.User (org. springframework.security.core.userdetails.User и com.nickjojo.ecomapp.entity.User находятся в безымянном модуле загрузчика 'app')

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Я бы хотел улучшить пару вещей:

  1. Ваш класс User уже реализует UserDetails, поэтому нет необходимости преобразовывать его в org.springframework.User в ваш UserDetailsService.loadUserByUsername. Просто верните его.

  2. Вместо того, чтобы проходить через SecurityContext, вы можете просто go с аннотацией @AuthenticationPrincipal, например, так (обратите внимание, это будет нулевым, если пользователь не вошли в систему):

@ PostMapping ("/ cart / {id}")

public String addProduct(... @AuthenticationPrincipal user) {
// ...
}
0 голосов
/ 19 апреля 2020

Я нашел ответ. Я приводил User к объекту принципа, но вместо этого я приводил UserDetails к объекту (они могут быть преобразованы вместе), а затем получил имя пользователя объекта, указанное в качестве одного из полей, при возврате объекта UserDetails в классе UserDetailsService. Затем я использовал это имя пользователя, чтобы найти пользователя через мой сервис.

        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    String username = ((UserDetails) principal).getUsername();
    User user = userService.findByUsername(username);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...