6

スプリング ブート レスト ベースのバックエンドとポリマー ダーツ ベースのフロントエンドを備えた小さなアプリを作成しています。

現在、ログインメカニズムからセッション ID を受け取るのに苦労しています...

当初、私は を使用し、HeaderHttpSessionStrategyこれを使用して spring-session/redis セッション ストアに対して認証を行い、水平方向のスケーリングを有効にする予定でした。

問題は、Spring Security が常にログイン後にリダイレクトを実行し、dart でHttpRequest(html パッケージから) クラスを実行し、リダイレクト後に最初の応答からのヘッダー フィールドがもちろん存在/アクセスできなくなることです。クライアントの followRedirect を無効にしようとしましたが、これは IO パッケージでしか利用できないようですHttpRequest

次に切り替えようとしましCookieHttpSessionStrategyたが、dart httprequest は受信した Cookie をブラウザーの Cookie バックエンドに保存しないようです:-/

これは単純な問題のはずですが、ここで少し迷っています。これはそれほど難しいことではありません...

たとえば、intellij レスト クライアントを使用すると、すべてが機能し、Cookie またはヘッダー フィールドからセッション ID を抽出できます...

何か案は?:-/

4

2 に答える 2

2

Dart は常にブラウザーでこれらのリダイレクトに従っているように見えますが、最初の要求のヘッダーで Cookie やトークンを取得する機会がありません。

したがって、代替ソリューションとして、次にこれを実行しようとしています:

春のセキュリティで基本認証を有効にします。

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/logout").permitAll()
                .anyRequest().authenticated()
                .and()
                .httpBasic()
                .and()
                .sessionManagement().sessionFixation().changeSessionId()
                .and()
                .csrf().disable();
    }
...
}

あるコントローラには、保護されたリソースとして次のようなものがあります。

@RequestMapping(value = "login", method = RequestMethod.POST)
public String login() {
    return RequestContextHolder.currentRequestAttributes().getSessionId();
}

このようにして、通常の結果としてセッション ID を取得できます。そのため、応答本文から ID を取得し、正しい基本認証資格情報を一度提供した後にそれを使用するだけです。

これは、信頼できる環境または https 経由でのみ使用して、悪意のある人物が資格情報またはセッションを傍受するのを困難にする必要があります。

したがって、基本的にこれは私がログインするために行うことです:

void login() {
  Map<String, String> headers = {};
  authorize(headers);
  HttpRequest.request(LOGIN_URL, method: "POST", requestHeaders: headers)
  .then((request) => processLogin(request))
  .catchError((e) => processLoginError(e));

}

void processLogin(HttpRequest request) {
  sessionController.sessionId=request.responseText;
  mainApp.showHome();
}

void processLoginError(var e) {
  print("total failure to login because of $e");
}
String authorization() {
  String auth = window.btoa("$username:$password");
  return "Basic $auth";
}

void authorize(Map<String, String> headers) {
  headers.putIfAbsent("Authorization", () => authorization());
}

HeaderHttpSessionStrategyIでリクエストを送信するには、次のようにします。

void updateUserData(){
  _logger.info("Updating user data");
  Map<String, String> headers = {"Accept": "application/json", 'x-auth-token':sessionId};
  HttpRequest.request(USER_URL, method: "GET", requestHeaders: headers)
    .then((request) => processUserData(request))
    .catchError(ErrorHandler.handleHttpErrorGeneric);
}

Cookie を使用することもできますがHttpRequest.request()、ヘッダー フィールドを使用する方が簡単だったので気に入っています。

于 2015-02-01T20:20:09.480 に答える