如何在Spring Security中获取用户名(在我的情况下是电子邮件)[UserDetails / String]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Spring Security中获取用户名(在我的情况下是电子邮件)[UserDetails / String]相关的知识,希望对你有一定的参考价值。

我想在我的应用程序中收到用户名的电子邮件,以设置发送邮件的用户。我决定使用典型的方法,即principal和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"
}
答案
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();
        }

以上是关于如何在Spring Security中获取用户名(在我的情况下是电子邮件)[UserDetails / String]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 在代码中获取用户的授权凭据?

如何使用spring security在grails中获取所有当前登录用户的列表(包括rememberme cookie)

spring-security saml2:如何获取当前用户?

如何在 Spring 获取之前捕获 Spring Security 登录表单?

如何使用 Spring Security 在我的控制器中获取用户登录的角色

如何使用 Spring Security 获取当前用户的角色