使用Spring和JPA进行RESTfull用户会话

时间:2017-04-24 04:07:38

标签: java mysql spring spring-boot spring-data-jpa

如何根据与JPA连接的mySQL数据库中的信息轻松创建spring用户会话?

作为一个简单的例子,假设我有2个表:

用户

  • INT id
  • VARCHAR(30)用户名
  • VARCHAR(20)密码

书签

  • INT id
  • VARCHAR(20)名称
  • TEXT desctription
  • int user (FK)

用户可以通过请求以下网址来查看他们的书签:

http://localhost:8080/bookmarks

通过这种方式,我需要单独的用户会话(在这种情况下,身份验证不是我的主要优先级),以便能够显示特定于用户的书签。

另一种方法是通过以下方式访问书签信息:

http://localhost:8080/{userId}/bookmarks

在这种情况下,如何阻止用户访问其他用户的书签信息? (例如阻止用户ID 1使用网址http://localhost:8080/2/bookmarks

访问用户ID 2的书签

1 个答案:

答案 0 :(得分:1)

如果您使用Spring Security来保护您的应用,您可以创建自定义UserDetailsService来读取来自数据库的每个请求的用户数据。像这样:

@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    protected UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String email)
            throws UsernameNotFoundException {
        User user = userRepository.findByEmail(email);
        if (user == null) {
            throw new UsernameNotFoundException(String.format("User with email=%s was not found", email));
        }
        return user;
    }
}

当然假设你有一个名为User的JPA实体实现UserDetails接口。

使用此机制,您可以将User实例注入MVC​​控制器:

@GetMapping("/bookmarks")
public List<Bookmark> readBookmarks(Principal principal) {
    User user = (User) principal;
    // read bookmarks code
}

您还可以通过以下方式阅读应用中的任何位置:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
User user = (User) principal;

对评论的反应

这是一个广泛的主题,需要做出很多决定。例如您可以考虑使用JWT,OAUTH2或基于令牌的身份验证。如果您从Spring Security开始,我建议您查看他们的Guides section。特别是Spting MVC指南与您相关。