2012-04-10 18 views

答えて

9

サーブレットをテストするには、少なくとも2つのGoogleアカウントが必要です。 Google App Engine管理コンソールで少なくとも1つのGoogleアカウントをビューアとして追加する必要があります。他のGoogleアカウントは追加しないでください。管理コンソールに追加されていないGoogleアカウントは、役割が管理者として定義されているサーブレットにはアクセスできません。

何らかの理由でテストが失敗した場合は、ドキュメントのすべての手順を実行してサーブレットを保護し、認証スキーマを実装する必要があります。 Google OAuthとUserServiceを例にして以下に概要を示します。

Google App Engineを使用すると、アプリケーション内で使用する2つの役割User and Adminが提供されます。

管理者ユーザーは、Google App Engineプロジェクトにany one of the three rolesとしてリストされているユーザーとして定義されています。そのため、サーブレットへの管理者アクセス権を付与する場合は、http://appengine.google.comパネルにビューアとして追加できます。

UserServiceクラスを使用すると、ログインしたユーザーにアクセスできます。これを使用してユーザーのログインURLを作成し、自分のGoogleアカウントを使用してGoogleからログオンし、アプリケーションにリダイレクトしてからUserService.isUserAdmin()を使用して、そのユーザーが本当に管理者ユーザーかどうかを判断する必要があります。

Using the Users Serviceは、UserServiceクラスの使用を開始する方法を詳しく説明しています。

package guestbook; 

import java.io.IOException; 
import javax.servlet.http.*; 
import com.google.appengine.api.users.User; 
import com.google.appengine.api.users.UserService; 
import com.google.appengine.api.users.UserServiceFactory; 

public class GuestbookServlet extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 
     UserService userService = UserServiceFactory.getUserService(); 
     User user = userService.getCurrentUser(); 

     if (user != null) { 
      resp.setContentType("text/plain"); 
      if(userService.isUserAdmin()) { 
       resp.getWriter().println("Hello, " + user.getNickname() + ", you are logged in as an admin"); 
      } else { 
       resp.getWriter().println("Hello, " + user.getNickname()); 
      } 
     } else { 
      resp.sendRedirect(userService.createLoginURL(req.getRequestURI())); 
     } 
    } 
} 

Google App Engine Users Java API Overviewは、Google App Engineの上のユーザのログイン処理する方法を示しています

import java.io.IOException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import com.google.appengine.api.users.UserService; 
import com.google.appengine.api.users.UserServiceFactory; 

public class MyServlet extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 
     UserService userService = UserServiceFactory.getUserService(); 

     String thisURL = req.getRequestURI(); 

     resp.setContentType("text/html"); 
     if (req.getUserPrincipal() != null) { 
      resp.getWriter().println("<p>Hello, " + 
           req.getUserPrincipal().getName() + 
           "! You can <a href=\"" + 
           userService.createLogoutURL(thisURL) + 
           "\">sign out</a>.</p>"); 
     } else { 
      resp.getWriter().println("<p>Please <a href=\"" + 
           userService.createLoginURL(thisURL) + 
           "\">sign in</a>.</p>"); 
     } 
    } 
} 

サーブレットの保護:

を使用すると、ユーザーはすべきではないページがある場合サインインしない限りアクセスすることができます。デプロイメント記述子内のページにセキュリティ制約を設定できます(web.xml

Deployment Descriptor: Security and Authentication」ページでは、管理者だけが特定のサーブレットにアクセスできるようにweb.xmlを変更する方法を示しています。この例では

<security-constraint> 
    <web-resource-collection> 
     <url-pattern>/profile/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>*</role-name> 
    </auth-constraint> 
</security-constraint> 

<security-constraint> 
    <web-resource-collection> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 

、サーブレット/profile*によって示される任意の役割を持つユーザによってアクセス可能であり、そして/adminサーブレットロールadmin持つユーザーによってのみアクセス可能です。

Google App Engine Javaにはセキュリティが組み込まれていますが、役割は多少限定されています。ユーザーの役割をより細かく制御する必要がある場合は、Luke Taylor's Post on Spring Security in Google App Engineを参照してください。この例は古いですが、ログレベルをTRACEに設定すると、Springの最新バージョンと最新のGAE SDKで動作させることができます。

+0

私は、Spring Frameworkの残りの部分がなくてもSpring Securityを使用できるとは思いません。特定のフレームワークに強制されることなく使用できる類似のものはありますか?ありがとう – husayt

+1

@husayt - 春はかなりモジュラーです。 Spring SecurityはapplicationSecurity-Contextで構成されていました。xmlでは、どのようなURLパターンがどのような役割にマッピングされているかを定義しました。残りは履歴でした。私は静的ファイルをロックダウンすることができたので、それをフレームワークの一部ではないものに適用することができます。要するに、あなたは本当に確かめるためにそれを試さなければならないでしょう。 – jmort253

+0

優秀な答え! – nhaarman

関連する問題