2016-04-12 27 views
0

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"); 
      }); 
     }; 
    }); 

答えて

0

RESTサーバーで認証するために、あなたは、各リクエストのヘッダーに認証トークンを送信する必要があります。トークンの値はjQueryのを用いた例をここBASIC

"Authorization" = "Basic " + btoa(username + ":" + password) 

で始まりである:How to use Basic Auth with jQuery and AJAX?。 RESTサービスは、定義上ステートレスでなければなりませんようRESTサービスで上記のステートレス認証は、推奨され

var req = { 
     method: 'POST', 
     url: 'https://localhost:9191/PISuiteService_Exp/', 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded', 
      'Authorization': 'Basic ' + btoa($scope.username + ':' + $scope.password), 
     }, 
     transformRequest: function (obj) { 
      var str = []; 
      for (var p in obj) 
       str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
      return str.join("&"); 
     } 
     }; 

は角を使用すると、このようなリクエスト(ヘッダフィールドをチェックしてください)を作成します。

ただし、セッションの最初に1回認証する必要があります。 GlassFishは認証されていないと自動的にログインフォームを起動し、セッションの残りの部分ではログイン情報を保持していたため、これはおそらく最初の場所でした。

この場合、POSTリクエストによってログインデータを送信するためにフォームベースの認証を使用することができます。詳細は、Java EE tutorialをご覧ください。

<form method="POST" action="j_security_check"> 
<input type="text" name="j_username"> 
<input type="password" name="j_password"> 
</form> 
+0

ありがとう、OndrejMさん、ありがとうございます。残念ながら、それはまだ動作しません。あなたはRESTサーバーに認証するために、各ヘッダーでAuthorizationトークンを送信する必要があると言います。ただし、GlassFishサーバーに依存して、RESTサービスの最初の要求に対してHTTP 401応答を送信したときに認証要求を開始する場合は、これは当てはまりません。私は、ファクトリサービスを使ってRESTfulなサービスにアクセスし、HTTPリクエストでは何もしないでデータを取得しました。私はサービスに一度認証します。それだけです。私はそのように保つことを望む。 –

+0

RESTサービスはステートレスでなければならないため、リクエストごとにHTTPヘッダーを使用することをお勧めします。しかし以前と同じステートフルな振る舞いをしたいなら、私はフォームベースの認証についての答えに多くの情報を追加しました。コード例はHTMLフォームですが、JavaScriptでPOSTリクエストを作成するのは簡単です。 – OndrejM

+0

OndrejMのお手伝いをもう一度ありがとうございます。まだ問題がありますが、私は本当にあなたの最初の答えが行く方法だと思います。これが意味することは、私が本当に質問する必要があるということです。「リクエストごとに承認トークンが必要となるようにGlassFishでRESTfulサービスを設定するにはどうすればよいですか?"私は検索してきましたが、これを設定している人の堅実な例を見つけたわけではありません。そのような例を知っている人は誰ですか? –

関連する問題