我曾尝试在web.xml中使用security-constraint。我通过使用角色授予管理员权限。如何测试servlet是否安全并且只能由管理员访问?
答案 0 :(得分:8)
要测试servlet,您至少需要两个Google帐户。必须在Google App Engine管理控制台中添加一个Google帐户作为至少一个查看者,不得添加其他Google帐户。未在管理控制台中添加的Google帐户无法访问将角色定义为admin的任何servlet。
如果由于某种原因测试失败,您需要确保已按照文档中的所有步骤来保护servlet并实现身份验证架构。以下概述了使用Google OAuth和UserService作为示例。
Google App Engine开箱即用,可为您提供在应用程序中使用的两个角色:用户和管理员。
管理员用户被定义为在Google App Engine项目中列为any one of the three roles的任何用户,因此如果您想授予某人管理员访问您的servlet的权限,您可以将其添加为{{{{{{ 3}}面板。
http://appengine.google.com类可让您访问已登录的用户。您需要使用此功能为您的用户创建登录网址,使用他或她的Google帐户通过Google登录,将他或她重定向到您的应用程序,然后使用UserService.isUserAdmin()
确定该用户是否确实管理员用户。
UserService详细介绍了如何开始使用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()));
}
}
}
Using the Users Service演示了如何在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>");
}
}
}
保护Servlet:
如果您拥有用户除非已登录就无法访问的页面,您可以为部署描述符中的那些页面建立安全约束(web.xml
Google App Engine Users Java API Overview页面演示了如何修改web.xml,以便只有管理员可以访问某些servlet。
<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>
在此示例中,具有任何角色的用户可以访问servlet /profile
,由*
表示,/admin
servlet只能由角色为{{1}的用户访问}。
虽然Google App Engine Java确实具有内置安全性,但角色有限。如果您需要更好地控制用户角色,请参阅Deployment Descriptor: Security and Authentication。该示例很旧,但如果您将日志记录级别提升到TRACE,则可以使其在最新版本的Spring和最新的GAE SDK上运行。