1

Spring Security を使用して、resful サーバー リソースの一部を保護し始めました。私のクライアントはリクエストに ajax (jquery ajax) を使用しており、ログイン機能の実装から始めました。

私のジャージー Web レイヤーには次のものが含まれます。

@Path("/login")
@Component
public class LoginResourceProvider extends ServiceResourceProvider {

    /*--- Static ---*/

    private final static ILogger logger = LogManager.getLogger(LoginResourceProvider.class);

    /*--- Members ---*/

    @Inject
    @Qualifier("authenticationManager")
    protected AuthenticationManager authenticationManager;

    @Inject
    protected SecurityContextRepository repository;

    @Inject
    protected RememberMeServices rememberMeServices;

    /*--- Constructors ---*/

    public LoginResourceProvider() {
    super("Login");
    }

    /*--- Public Methods ---*/

    @GET
    public void login() {
    }

    /**
     * A user login attempt
     * 
     * @param username
     *            The user name
     * @param password
     *            The password of the given user name
     * @param request
     * @param response
     * @return A JSON string, indicating if the login is successful
     */
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public String performLogin(@QueryParam("j_username") String username, @QueryParam("j_password") String password,
        @Context HttpServletRequest request, @Context HttpServletResponse response) {

    // Create a token
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
    SecurityContext securityContext = SecurityContextHolder.getContext();

    try {
        // Attempting to authenticate the user
        Authentication auth = authenticationManager.authenticate(token);

        // Updating the SecurityContext, which represents the user's
        // secured, authenticated session
        securityContext.setAuthentication(auth);

        // If the user authenticates successfully then the authentication
        // storing the security context in the HttpSession between requests
        repository.saveContext(securityContext, request, response);

        // object is passed to the remember-me service
        rememberMeServices.loginSuccess(request, response, auth);

        // Successfully authenticated
        return "{\"status\": true}";

        // Bad Credentials
    } catch (BadCredentialsException ex) {
        return "{\"status\": false, \"error\": \"Bad Credentials\"}";
    }
    }
}

私の security-context.xml は今のところ非常に基本的なもので、ログイン プロセスをテストするには十分です。

<http use-expressions="true">
    <form-login />
    <remember-me />
    <intercept-url pattern="/**" access="permitAll" />
    <intercept-url pattern="/secured/**" access="isAuthenticated()" />
</http>

<authentication-manager alias="authenticationManager">
    <authentication-provider>
        <user-service>
            <user name="bob" password="bobspassword" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

2 つの質問があります。

  1. それは良い習慣ですか?つまり、そこには ajax スタイルのリクエスト用の「非自動」ログインがたくさん見つかりませんでした。

  2. セキュリティ コンテキストを SecurityContextRepository に保存しようとすると、次の行で例外が発生します。

    repository.saveContext(securityContext, リクエスト, レスポンス);

bob をユーザー名と bobspassword パスワードとして使用してログインしようとすると、認証はスムーズに行われますが、この特定の行をデバッグしているときに、次のメッセージで ClassCastException にジャンプしています。

$Proxy31 cannot be cast to org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper

どんな助けでも大歓迎です!

4

1 に答える 1

1

わかりました、私はそれを手に入れたと思います。

Spring のドキュメントによると、認証は次の手順を使用して行われます。

  1. ユーザー名とパスワードが取得され、UsernamePasswordAuthenticationToken のインスタンス (前に見た Authentication インターフェースのインスタンス) に結合されます。
  2. トークンは、検証のために AuthenticationManager のインスタンスに渡されます。
  3. AuthenticationManager は、認証が成功すると、完全に設定された Authentication インスタンスを返します。
  4. セキュリティ コンテキストは、 SecurityContextHolder.getContext().setAuthentication(...) を呼び出し、返された認証オブジェクトを渡すことによって確立されます。

上記の手順に加えて、SecurityContext を SecurityContextRepository に保存することで、リクエスト間に SecurityContext を保存しようとしました。リクエスト間で SecurityContext を格納する責任は、この操作を呼び出す SecurityContextPersistenceFilter に委ねられる必要があるため、手動で行う必要はありません。上記の 4 つの手順のみに固執する必要があると思います。

更新: Spring-Security が既に実装しているものを自分で実装しようとしたと思います。このアプローチに従うことはお勧めしません。Spring-Security は、はるかに単純なプラクティスを提供します。

于 2012-07-31T08:46:07.603 に答える