2017-04-24 47 views
1

如何根据与JPA相关联的mySQL数据库中的信息轻松创建Spring用户会话?Spring和JPA的RESTfull用户会话

作为一个简单的例子可以说我有2个表:

用户

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

书签

  • INT ID
  • VARCHAR(20)名
  • TEXT desctription
  • INT用户(FK)

用户将能够通过请求观看他们的书签以下网址:

http://localhost:8080/bookmarks 

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

另一种方式去是通过访问书签信息:

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

在这种情况下,我怎么能阻止用户访问其他用户的书签信息? (如防止用户ID 1,从使用url http://localhost:8080/2/bookmarks

回答

1

如果你想使用Spring Security来保护您的应用程序访问用户ID 2S'的书签,您可以创建自定义UserDetailsService读取用户数据从DB每个请求。东西是这样的:

@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; 
    } 
} 

当然,假设你有JPA的实体,称为User实现的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指南与你有关。

+0

我按照你的说法完成了项目,看起来都很好,但是如何才能以用户身份“登录”呢? –