私はSpring Data REST WebアプリケーションをAngularJSで保護するためにSpring Securityを使用しています。Spring Security Cookieが最初に禁止されたリクエストの後にのみAngularに到着します
私SecurityConfigは次のように宣言されています:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().and()
.authorizeRequests()
// public ressources
.antMatchers("/index.html", "/templates/public/**", "/js/**", "/").permitAll()
.antMatchers(HttpMethod.GET, "/api/security/user").permitAll()
.antMatchers("/api/**").hasAnyRole("ADMIN", "NORMALUSER")
.anyRequest().authenticated()
.and().exceptionHandling().authenticationEntryPoint(basicAuthenticationEntryPointHandler)
.and().logout().logoutUrl("/logout").logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()).deleteCookies("JSESSIONID").permitAll().and()
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
は、私は一般的に自分の目標に到達するためのthisリンクを追いました。
初めてログインすると、$cookies.get("XSRF-TOKEN")
の角度要求はを返します。定義されていないのはです。データベースへのリクエストはすべてブロックされません。
しかし、ログアウトしてもう一度ログインすると、Cookieが返され、すべてのデータベースリクエストが許可されます。
そして、これはこれだけ毎秒ログイン、起こる:
- 未定義を
- クッキー
- 未定義
- クッキー
未定義
...
だから、私の構造に深く入り込むことなく私を助けることができる人がいることを願っていますが、必要ならば私はそうします。
ありがとうございます。
:ここでは要求されている。私は私のCokieCsrfTokenRepository()loadToken()でトークンをロギングしていて、そこにすべてのトークンが表示されます。..
編集2:私はすべてのログインで呼んでいる私の角度サービス、:
function authenticationService($rootScope, $http, $location, $filter, $cookies){
function authenticate(credentials, callback) {
var headers = credentials ? {authorization : "Basic "
+ btoa(credentials.username + ":" + credentials.password)
} : {};
$http.get('api/security/user', {headers : headers}).success(function(data, status, get, header) {
if (data.name) {
$rootScope.authenticated = true;
$rootScope.session = data;
console.log($cookies.get("XSRF-TOKEN")) // -> returns every second login cookie
} else {
$rootScope.authenticated = false;
$rootScope.session = null;
}
console.log($rootScope.session)
callback && callback();
}).error(function() {
$rootScope.authenticated = false;
callback && callback();
});
}
return {
authenticate: function(credentials){
authenticate(credentials, function() {
if ($rootScope.authenticated == true) {
$rootScope.authenticationError = false;
if ($rootScope.session.principal.admin == true){
$location.path("/admin/manage");
} else{
$location.path("/user");
}
} else {
$rootScope.authenticationError = true;
$location.path("/login");
}
});
},
// called by refreshing browser
checkLoggedIn: function(){
authenticate();
},
logout: function(){
$http.post('/logout', {})["finally"](function() {
$rootScope.authenticated = false;
$rootScope.session = null;
$location.path("/login");
});
}
};
}
編集3:クッキーが未定義の場合、loadToken()のメソッドthisがブラウザからログアウトし、最初にログインした後にのみ呼び出されることになりました。それからトークンが表示され、私は再びログインしています。だから、何も私は認識し、最初の禁断のPOSTリクエスト(EDIT3で、それは/ログアウトだ)した後、トークンが私のテンプレートを到着したことを:しかし、すべての後に、第2のそれはまだ...素晴らしい作品
編集4を試していません。ブラウザを更新した後は、すべてのリクエストに対してCookieが送信されるため、すべてのリクエストが許可されます。しかし、これを修正する方法は?