【问题标题】:How to retrieve all data of the current User in controller?如何在控制器中检索当前用户的所有数据?
【发布时间】:2020-03-31 17:04:17
【问题描述】:

我需要获取当前登录用户的所有数据,并将其以 JSON 格式发送到路由“/home”。我正在寻找如何做到这一点,但什么都没有。我发现我只能接受用户名和权限there。有人可以帮我处理吗?谢谢大家。

有我的AuthController.java

    // Getting all user data
    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String getUsersDataById(Principal principal) {
        return principal.getName();
    }

有我的UserRepository

import com.example.demo.Models.Users;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<Users, Integer> {
    Optional<Users> findByUsername(String username);
}

有我的服务: MyUserDetails.java

public class MyUserDetails implements UserDetails {
    private String username;
    private String password;
    private String firstname;
    private String lastname;
    private String email;
    private String last_login_date;
    private String registration_date;
    private String last_login_ip;
    private Integer balance;
    private Integer status;
    private String brith_date;
    private List<GrantedAuthority> authorities;
    private boolean active;

    public MyUserDetails(Users user) {
        this.username = user.getUsername();
        this.password = user.getPassword();
        this.authorities = Arrays.stream(user.getRoles().split(","))
                .map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());
        this.active = user.isActive();
    }

    public MyUserDetails(String username, String firstname, String lastname, String email, String last_login_date, String registration_date, String last_login_ip, Integer balance, Integer status, String brith_date) {
        this.username = username;
        this.firstname = firstname;
        this.lastname = lastname;
        this.email = email;
        this.last_login_date = last_login_date;
        this.registration_date = registration_date;
        this.last_login_ip = last_login_ip;
        this.balance = balance;
        this.status = status;
        this.brith_date = brith_date;
    }

    public MyUserDetails() {
    }
//  and Override methods by default..

MyUserDetailsS​​ervice

@Service
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<Users> user = userRepository.findByUsername(username);

        user.orElseThrow(() -> new UsernameNotFoundException("Not found: " + username));

        return user.map(MyUserDetails::new).get();
    }
}

Users.java 包含表中的列以及没有构造函数的 geters 和 setter

@Entity
@Table(name = "users")
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String username;
    ...
    /// etc..

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    ...
    // etc..

【问题讨论】:

  • 见下面的答案。我希望它解决了这个问题。如果确实如此。接受它作为答案。

标签: spring spring-boot spring-security


【解决方案1】:

使用 @AuthenticationPrincipal 注释您的方法并使用 UserDetails。

    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public Userdetails getUsersDataById(@AuthenticationPrincipal UserDetails userDetails) {


        return userDetails;
    }

【讨论】:

  • 是的,没错。
  • 他想要所有信息,所以只需返回UserDetails,如果是名称,Principal 方法就足够了。
  • 终于,我找到了我想要的!谢谢!
猜你喜欢
  • 2022-01-03
  • 2021-06-08
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多