Как получить имя пользователя (адрес электронной почты в моем случае) в Spring Security [UserDetails / String] - PullRequest
0 голосов
/ 17 сентября 2018

Я хотел бы получить электронное письмо с именем пользователя в моем приложении, чтобы указать пользователя, отправляющего сообщение. Я решил использовать типичный метод, то есть принципал и getUsername ():

@PostMapping("/messages/{id}")
@ResponseStatus(HttpStatus.CREATED)
public MessageDTO addOneMessage(@RequestBody MessageRequest messageRequest, @PathVariable ("id") Long id) {
    checkIfChannelExists(id);

    String content = messageRequest.getContent();

    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    String username = ((UserDetails) principal).getUsername();
    Employee author = employeeRepository.findByEmail(username).get();

    Message message = new Message(content, author, id);
    messageRepository.save(message);
    return new MessageDTO(message);
}

и MessageRequest.java:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MessageRequest {

    @NonNull
    private String content;
}

Но, таким образом, я все еще получаю:

"message": "java.lang.String cannot be cast to org.springframework.security.core.userdetails.UserDetails"

Что не так в моей реализации? Чтобы быть более точным, я использую Postman для проверки POST-запросов:

{
    "content": "something"
}

1 Ответ

0 голосов
/ 17 сентября 2018
If you only need to retrieve the username you can get it through Authentication ie.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();

вместо того, чтобы привести тип к вашему классу, springcontext предоставит почти все подробности о пользователе. Если вы хотите, чтобы контроллер получил имя пользователя для тестирования. пожалуйста, используйте этот код.

//using authentication
    @RequestMapping(value = "/name", method = RequestMethod.GET)
        @ResponseBody
        public String currentUserName(Authentication authentication) {
            return authentication.name();
        }
//using principal   
        @RequestMapping(value = "/name", method = RequestMethod.GET)
        @ResponseBody
        public String currentUserName(Principal principal) {
            return principal.getName();
        }
...