2

適切な認証後にユーザーがアクセスする必要がある RESTful Web サービスを設計しています。Spring Security 3.0 を使用して、アプリケーションのセキュリティを既に開発しています。ここで、TokenBasedAuthentication を統合したいと考えています。しかし、私はこれを行う方法についてここで立ち往生しました。

私のApplicationContextSecurity.xml:

<global-method-security pre-post-annotations="enabled">
    </global-method-security>
    <beans:bean id="myAccessDecisionManager"
        class="com.app.security.MyAccessDecisionManager">
    </beans:bean>
    <http auto-config="true" once-per-request="true"
        access-decision-manager-ref="myAccessDecisionManager"       
        access-denied-page="/jsp/errorPage.jsp">
        <intercept-url pattern="/*.app" access="ROLE_ANONYMOUS" />
        <form-login login-page="/login.app"
            login-processing-url="/j_spring_security_check" default-target-url="/login/checking.app"
            authentication-failure-url="/login.app?login_error=1" />
        <logout logout-url="/j_spring_security_logout"
            logout-success-url="/login.app" invalidate-session="true" />
        <session-management invalid-session-url="/login.app"
            session-fixation-protection="newSession">
            <concurrency-control max-sessions="100"
                error-if-maximum-exceeded="false" />
        </session-management>
    </http>

    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="customAuthenticationProvider"></authentication-provider>
    </authentication-manager>

    <beans:bean id="customAuthenticationProvider"
        class="com.app.security.CustomAuthenticationProvider">
    </beans:bean>

私の CustomAuthenticationProvider :

public class CustomAuthenticationProvider implements AuthenticationProvider {

@Autowired
private ILoginService loginService;

protected final transient Log log = LogFactory.getLog(getClass());

public Authentication authenticate(Authentication authentication)
        throws AuthenticationException {

    UsernamePasswordAuthenticationToken usernamePassswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
            authentication.getPrincipal(), authentication.getCredentials());

    // Doing authentication process here and returning authentication token
    return usernamePassswordAuthenticationToken;
}

public boolean supports(Class<? extends Object> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}

私の要件は、

  • ユーザーが最初に残りの Web サービスにアクセスする場合、ヘッダーからサーバーにユーザー名/パスワードを提供する必要があります。
  • サーバーはリクエストを受け入れ、認証を確認し、特定の期間の将来のリクエストのためにトークンを生成します。また、セキュリティで保護された Web サービスにアクセスするためのクライアント側コードも必要です。ありがとう。
4

1 に答える 1

1

ユーザーが最初に残りの Web サービスにアクセスする場合、ヘッダーからサーバーにユーザー名/パスワードを提供する必要があります。

サーバーはリクエストを受け入れ、認証を確認し、特定の期間の将来のリクエストのためにトークンを生成します

これは、HTTP ヘッダーを使用するか、Spring MVC コントローラーにマップされた通常の HTTP POST リクエストを使用して行うことができます (これがアプリで行う方法です)。

@Controller
public class AuthenticationController {
    @Autowired
    @Qualifier("authenticationManager")
    AuthenticationManager     authenticationManager;

    @Autowired
    SecurityContextRepository securityContextRepository;

    @RequestMapping(method = RequestMethod.POST, value = "/authenticate")
    public @ResponseBody String authenticate(@RequestParam final String username, @RequestParam final String password, final HttpServletRequest request, final HttpServletResponse response) {
        final UsernamePasswordAuthenticationToken authenticationRequest = new UsernamePasswordAuthenticationToken(username, password);
        final Authentication authenticationResult = this.authenticationManager.authenticate(authenticationRequest);

        final String token = <some randomly generated secure token>;

        final Authentication authentication = new MyAuthenticationToken(authenticationResult, token);

        SecurityContextHolder.getContext().setAuthentication(authentication);

        this.securityContextRepository.saveContext(SecurityContextHolder.getContext(), request, response);

        return token;
    }
}

これが完了すると、クライアントは後続のすべてのリクエストで HTTP ヘッダーでトークンを送信する必要があります。

また、セキュリティで保護された Web サービスにアクセスするためのクライアント側コードも必要です

ここで何を探しているのか正確にはわかりません。クライアントが Web ブラウザで実行されている JavaScript ライブラリである場合、すべてのリクエストで認証トークンを HTTP ヘッダーとして設定するのは簡単です。クライアントがデバイスの場合、デバイスはトークンをメモリに保存し、サービスの呼び出しに使用している HTTP クライアント ライブラリを使用するすべてのリクエストに HTTP ヘッダーとして含めることができます。

于 2014-02-12T08:22:37.700 に答える