GlassFish 4.1で提供されるRESTfulなサービスを使用するAngularJSプログラムがあります。 web.xmlファイルで定義されているRESTfulなサービスの認証要件があります。開発中は、WebサイトがRESTfulなサービスにアクセスしようとするたびに、ブラウザ認証リクエストを起動するためにGlassFishに頼ってきました。これはうまくいきました。しかし、今では、ui-routerとログインコントローラを使って、HTTPポスト経由でGlassFishにユーザ名とパスワードを送信したいと考えています。 HTTPポストは機能していません。その間、GlassFish側の認証要件を無効にし、GlassFishへのログインを成功させる模擬ログインをしてから、ui-routerが残りを処理しますユーザーが「ログイン」した後認証後のルーティングは美しく動作しているので問題はありません。私の問題は次のとおりです。サービスにアクセスする際に認証が必要な現在の設定で、GlassFishサーバーにユーザー名とパスワードを正しく送信するにはどうすればよいですか?以下はweb.xmlとログインコントローラです。助けてくれてありがとう。AngularJS経由のGlassFish 4.1サーバーへのBASIC認証
web.xmlの
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enforce TLS</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<!-- require SSL -->
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Secure Pages</web-resource-name>
<description/>
<url-pattern>/tsn/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>tsnadmin</role-name>
<role-name>tester</role-name>
</auth-constraint>
<user-data-constraint>
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>tsnRealm</realm-name>
</login-config>
<security-role>
<role-name>tsnadmin</role-name>
</security-role>
<security-role>
<role-name>tester</role-name>
</security-role>
</web-app>
コントローラー:
'use strict';
angular.module('pisuiteClientExpApp')
.controller('LoginModalCtrl', function (
$scope,
$timeout,
$http,
userRoles,
auagByUserSvc) {
this.cancel = $scope.$dismiss;
/*this.submit = function() {
$scope.dataLoading = true;
$timeout(function() {
$scope.user;
if ($scope.username === 'rpurvis') {
$scope.user = {uname: 'rpurvis', role: userRoles.tester,
success: $scope.username === 'rpurvis' && $scope.password === 'password'};
} else if ($scope.username === userRoles.admin) {
$scope.user = {uname: userRoles.admin, role: userRoles.admin,
success: $scope.username === userRoles.admin && $scope.password === 'password'};
}
if (!$scope.user.success) {
$scope.user.message = 'Username or password is incorrect';
$scope.user = null;
$scope.$close($scope.user);
} else {
auagByUserSvc.get({user: $scope.user.uname}, function (auag_success) {
/*console.log("setting images to an array of length: " + data.length)
if (auag_success.length > 0) {
$scope.user.role = auag_success[0].idAuthGroup.idAuthGroup;
$scope.user.inspectorid = auag_success[0].idAuthUser.inspectorid;
}
$scope.$close($scope.user);
}, function (error) {
$scope.$close($scope.user);
});
}
}, 1000);*/
var req = {
method: 'POST',
url: 'https://localhost:9191/PISuiteService_Exp/',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
transformRequest: function (obj) {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
return str.join("&");
},
data: {username: $scope.username, password: $scope.password}
};
$http(req).then(function (success) {
$scope.user = {uname: $scope.username};
console.log("in post success");
auagByUserSvc.get({user: $scope.username}, function (auag_success) {
if (auag_success.length > 0) {
$scope.user.role = auag_success[0].idAuthGroup.idAuthGroup;
$scope.user.inspectorid = auag_success[0].idAuthUser.inspectorid;
}
$scope.$close($scope.user);
}, function (error) {
$scope.$close($scope.user);
});
}, function (error) {
console.log("in post error");
$scope.user.message = 'Username or password is incorrect';
$scope.user = null;
$scope.$close($scope.user);
}, function (progress) {
console.log("in post progress");
});
};
});
ありがとう、OndrejMさん、ありがとうございます。残念ながら、それはまだ動作しません。あなたはRESTサーバーに認証するために、各ヘッダーでAuthorizationトークンを送信する必要があると言います。ただし、GlassFishサーバーに依存して、RESTサービスの最初の要求に対してHTTP 401応答を送信したときに認証要求を開始する場合は、これは当てはまりません。私は、ファクトリサービスを使ってRESTfulなサービスにアクセスし、HTTPリクエストでは何もしないでデータを取得しました。私はサービスに一度認証します。それだけです。私はそのように保つことを望む。 –
RESTサービスはステートレスでなければならないため、リクエストごとにHTTPヘッダーを使用することをお勧めします。しかし以前と同じステートフルな振る舞いをしたいなら、私はフォームベースの認証についての答えに多くの情報を追加しました。コード例はHTMLフォームですが、JavaScriptでPOSTリクエストを作成するのは簡単です。 – OndrejM
OndrejMのお手伝いをもう一度ありがとうございます。まだ問題がありますが、私は本当にあなたの最初の答えが行く方法だと思います。これが意味することは、私が本当に質問する必要があるということです。「リクエストごとに承認トークンが必要となるようにGlassFishでRESTfulサービスを設定するにはどうすればよいですか?"私は検索してきましたが、これを設定している人の堅実な例を見つけたわけではありません。そのような例を知っている人は誰ですか? –