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());
}
HeaderHttpSessionStrategy
Iでリクエストを送信するには、次のようにします。
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()
、ヘッダー フィールドを使用する方が簡単だったので気に入っています。