Java 确保用户只能在REST API请求中访问其数据
我现在和泽西,斯普林一起工作。稍后将使用Android/iOS访问。Java 确保用户只能在REST API请求中访问其数据,java,android,spring,rest,oauth-2.0,Java,Android,Spring,Rest,Oauth 2.0,我现在和泽西,斯普林一起工作。稍后将使用Android/iOS访问。 例如,如果我在Jersey资源中有这样的用户设置@Path(“/user/{userID}/settings”)。如何确保每个用户只能访问其设置?我读了很多关于spring-security-oauth2的文章。但据我所知,您只能验证用户是否真的是用户,但如果他/她可以访问其他用户设置,则不会产生任何影响 您需要的是授权 授权可以区分每个用户的访问级别。 实际上,这是一个重要的话题。您可以使用角色、权限、ACL来保护服务 解决
例如,如果我在Jersey资源中有这样的用户设置
@Path(“/user/{userID}/settings”
)。如何确保每个用户只能访问其设置?我读了很多关于spring-security-oauth2的文章。但据我所知,您只能验证用户是否真的是用户,但如果他/她可以访问其他用户设置,则不会产生任何影响 您需要的是授权
授权可以区分每个用户的访问级别。
实际上,这是一个重要的话题。您可以使用角色、权限、ACL来保护服务
解决任务的最简单方法是使用path/user/settings
并找到您自己的身份验证,如:
public Settings find() {
UserDetails customUserDetails = (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return setingsService.findByUser(customUserDetails.getUsername());
}
创建您的CustomUserDetails:
public class CustomUserDetails implements UserDetails {
private User user;
private Collection<? extends GrantedAuthority> authorities;
public CustomUserDetails(User user) {
this.user = user;
}
public User getUser() {
return user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> authorities = new ArrayList<>();
for (Authority authority : user.getAuthorities()) {
authorities.add(new SimpleGrantedAuthority(authority.getName()));
}
return authorities;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
// implement other methods
}
只需在每次请求私有数据之前验证用户是否经过身份验证。您可能需要额外的安全层来完成所需的操作。OAuth允许您对用户进行身份验证,甚至分配角色,但您需要分别为角色/权限保护每个URL路径,例如
/user/ABC/settings
和/user/DEF/settings
。根据J-Alex下面的回答,安全性可以在Jersey框架(例如,您的负载平衡器)上方的一层中提供,也可以在其内部提供。第二个选项更简单。没有理由改变路径,调用SecurityContextHolder.getContext().getAuthentication().getPrincipal()
似乎在某种程度上打破了REST原则。。。服务器端不需要保存上下文。通过只查看请求,在没有设置安全上下文的情况下也可以应用相同的原则。
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userService.findByUsername(username);
// check if exist
}
return new CustomUserDetails(user);
}
}