Java 确保用户只能在REST API请求中访问其数据

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来保护服务 解决

我现在和泽西,斯普林一起工作。稍后将使用Android/iOS访问。
例如,如果我在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);
    }
}