2017-06-05 7 views
-1

Jersey、Springで今すぐREST APIを使用しています。後でAndroid/iOSでアクセスします。 ジャージーリソースに、たとえば@Path("/user/{userID}/settings"のようなユーザー設定がある場合)。すべてのユーザーが自分の設定にのみアクセスできるようにするにはどうすればよいですか?私はspring-security-oauth2についてたくさん読んでいます。しかし、限り、私はあなたが本当にユーザであることを確認することができますが、彼/彼女は他のユーザーの設定にアクセスすることができます違いを確認しないことを理解!ユーザーはREST APIリクエストで自分のデータにしかアクセスできないようにしてください

+0

プライベートデータの各要求の前に、ユーザーが認証されていることを確認するだけです。 – Chloe

+0

必要な作業を行うには、セキュリティのレイヤーが必要になるでしょう。 OAuthでは、ユーザーを認証したり、役割を割り当てることさえできますが、各URLパスを保護する必要があります。 '/ user/ABC/settings'と'/user/DEF/settings'をロール/パーミッションごとに個別に設定します。セキュリティは、以下のJ-Alexの回答に従って、Jerseyフレームワークの上のレイヤー(ロードバランサなど)またはその内部に提供することができます。 2番目のオプションは簡単です。 – RudolphEst

答えて

0

必要なものを認可といいます。

認可は、各ユーザーのアクセスのレベルをdistingushすることができます。 実際には大きな話題です。役割、アクセス許可、ACLを使用して、サービスを保護することができます。あなたのCustomUserDetailsを作成

public Settings find() { 
    UserDetails customUserDetails = (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    return setingsService.findByUser(customUserDetails.getUsername()); 
} 

あなたのタスクを解決するための最も簡単な方法は次のように、パス/user/settingsを使用して認証yourseftを見つけることです

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); 
    } 
} 
+0

パスが変更されなければならない理由はなく、 'SecurityContextHolder.getContext()。getPrincipal()'の呼び出しはRESTの原則を多少壊しているようです...サーバー側はコンテキストを保持する必要はありません。同じ原則が、セキュリティコンテキストが設定されていなくても、リクエストのみを見ることで適用できます。 – RudolphEst

関連する問題