0

データベース (MongoDB) からユーザー情報を取得し、この REST API を使用するクライアントにそのデータを返す RESTful API を Spring で開発しました。ただし、データが取得される前に、REST API はユーザーが管理者であるかどうかを確認します。管理者のみが GET 操作を実行してユーザー情報を取得できます

したがって、私の securityconfig.java クラスには次のものがあります。

http.authorizeRequests()
            .antMatchers("/users/get/**", "/users/get/**").hasRole("ADMIN");

http.httpBasic();

これで、すべてのユーザーにそれぞれの役割が与えられ、呼び出したときにすべてが期待どおりに機能しています。curl adminusername:adminpassword@localhost:8080/users/get/AllUsers

adminusernameのユーザー名を持つユーザーは管理者であり、権限を持っているため、すべてのユーザーを取得できます。しかし、管理者以外のユーザー名に置き換えるadminusernameと、アクセス拒否エラーが発生します。

私の質問は、adminusername:adminpassword@localhost:8080.... の前の部分は HTTP 要求のヘッダーですか?

私が尋ねる理由は、ログインできるクライアントを作成し、資格情報 (ユーザー名とパスワード) を検証し、ユーザー名とパスワードをセッション IDとして使用する必要があるためです。これにより、クライアントがいつでも HTTP 要求を行うことができます。ログイン後の呼び出しでは、ユーザー名とパスワードがヘッダーに追加され、REST API によって処理されます。

の hasRole()

http.authorizeRequests()
                .antMatchers("/users/get/**", "/users/get/**").hasRole("ADMIN");

username:passwordセキュリティ設定では@localhost:8080の前に依存しています.... これ@RequestHeaderはスプリングレスト API と同じですか?

4

1 に答える 1

0

まず第一に、Http Basic は、ヘッダーを介してユーザー資格情報を送信する方法です -

var header = {'Authorization': 'Basic '+btoa(username+':'+password)} //javascript

2 つ目は、ユーザーの権限です。システムでユーザーを作成し、それらに権限を追加する必要があります。次に例を示します。

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
            .withUser("mati").password("qwerty").roles("ADMIN", "USER").and()
            .withUser("mati2").password("qwerty").roles("USER");
}

Principalこれらのユーザーは、許可された権限 (「ROLE_USER」や「ROLE_ADMIN」など) を持つクラスから後でオブジェクトになりました。

たとえば、あなたが電話しているとき

curl adminusername:adminpassword@localhost:8080/users/get/AllUsers

Spring Security は適切かどうかをチェックしPrincipal(指定されたユーザー名で、パスワードが一致するかどうかをチェックします)、それをにロードし、権限 "ROLE_ADMIN"があるSecurityContextかどうかをチェックします (by による)。これはトリッキーだったことを付け加えなければなりません。正確には覚えていません。PrincipalhasRole("ADMIN")hasRole("ADMIN")hasRole("ROLE_ADMIN")

これがあなたの質問に答えることを願っています。

于 2015-07-18T14:18:46.820 に答える