如何根据与JPA连接的mySQL数据库中的信息轻松创建spring用户会话?
作为一个简单的例子,假设我有2个表:
用户
书签
用户可以通过请求以下网址来查看他们的书签:
http://localhost:8080/bookmarks
通过这种方式,我需要单独的用户会话(在这种情况下,身份验证不是我的主要优先级),以便能够显示特定于用户的书签。
另一种方法是通过以下方式访问书签信息:
http://localhost:8080/{userId}/bookmarks
在这种情况下,如何阻止用户访问其他用户的书签信息? (例如阻止用户ID 1使用网址http://localhost:8080/2/bookmarks
访问用户ID 2的书签答案 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指南与您相关。