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