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

时间:2017-06-05 17:44:24

标签: java android spring rest oauth-2.0

我正在使用Jersey,Spring正在使用REST API。以后可以使用Android / iOS访问。 如果我在Jersey资源中有例如此c[i]==v[j])的用户设置。如何确保每个用户只能访问他/她的设置?我已经阅读了很多关于spring-security-oauth2的内容。但据我所知,您只能验证用户是否真的是用户,但如果他/她可以访问其他用户设置,则无法有所作为?!

1 个答案:

答案 0 :(得分:0)

您需要的是授权。

授权可以降低每个用户的访问级别。 这实际上是主要话题。您可以使用角色,权限和ACL来保护服务。

解决任务的最简单方法是使用路径/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  

}

和CustomUserDetailsS​​ervice:

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