3

RESTコントローラー(URLパラメーター)を介してユーザーを認証する方法を探していました。これを行う最も近い方法は次のとおりです。

@Controller
@RequestMapping(value="/api/user")
public class UserController extends BaseJSONController{

    static Logger sLogger = Logger.getLogger(UserController.class);

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public @ResponseBody String login(@RequestParam(value="username") String user, @RequestParam(value="password") String pass) throws JSONException {
        Authentication userAuth = new UsernamePasswordAuthenticationToken(user, pass);
        MyCellebriteAuthenticationProvider MCAP = new MyCellebriteAuthenticationProvider();

        if (MCAP.authenticate(userAuth) == null){
            response.put("isOk", false);
        }
        else{
            SecurityContextHolder.getContext().setAuthentication(userAuth);
            response.put("isOk", true);
            response.put("token", "1234");
        }
        return response.toString();
    }

}

ただし、これは Cookie を作成しません。私が達成したいことを実装するためのアイデアやより良い方法はありますか?

4

1 に答える 1

3

まず、これを手動で行うべきではありません:

SecurityContextHolder.getContext().setAuthentication(userAuth)

認証を担当する特別なフィルターを採用し、セキュリティ コンテキストを設定し、リクエストが処理された後にそれをクリアすることをお勧めします。デフォルトでは、Spring Security はスレッド ローカルを使用してセキュリティ コンテキストを保存するため、クライアントの呼び出し後にそれを削除しないと、別のクライアントが別のユーザーとして自動的にログインする可能性があります。サーバー スレッドは、さまざまなクライアントによるさまざまな要求に対して再利用されることが多いことに注意してください。

次に、RESTful Web サービスには基本認証またはダイジェスト認証を使用することをお勧めします。どちらも Spring Security でサポートされています。ドキュメントの詳細http://static.springsource.org/spring-security/site/docs/3.1.x/reference/basic.html

最後に、RESTful Web サービスはステートレスである必要があることを思い出してください。

また、Spring Security のドキュメントはあなたの友達であることも忘れないでください。:-)

于 2012-11-28T20:22:52.157 に答える