1

web.xml で security-constraint を使用しようとしました。ロールを使用して管理者に許可を与えました。サーブレットが保護され、管理者のみがアクセスできるかどうかをテストするにはどうすればよいですか?

4

1 に答える 1

8

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

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

Google App Engine には、すぐに使用できる 2 つのロール (ユーザーと管理者) がアプリケーション内で使用できます。

管理者ユーザーは、Google App Engine プロジェクトの 3 つの役割のいずれかとしてリストされているユーザーとして定義されるため、サーブレットへの管理者アクセス権を誰かに付与したい場合は、http:// appengine.google.comパネル。

UserServiceクラスは、ログインしているユーザーへのアクセスを提供します。これを使用して、ユーザーのログイン URL を作成し、ユーザーの Google アカウントを使用して Google 経由でログインし、ユーザーをアプリケーションにリダイレクトしてから、UserService.isUserAdmin()そのユーザーが実際に管理者ユーザーであるかどうかを判断するために使用する必要があります。

ユーザー サービスの使用では、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 ユーザーの Java API の概要は、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、 で示されている任意のロールを持つユーザーがサーブレットにアクセスでき、ロール を持つユーザーのみがサーブレットにアクセスでき*ます。/adminadmin

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

于 2012-04-10T06:14:55.087 に答える