8

Tôi muốn yêu cầu người dùng sử dụng thông tin đăng nhập/mật khẩu khi truy cập một số phần của ứng dụng GAE (Google App Engine). Tôi muốn giới hạn quyền truy cập vào nhóm người dùng được xác định trước, ví dụ: trên trang, nơi dữ liệu mới có thể được tải lên Datastore.Xác thực trên Google App Engine (trang web)

tôi thấy có 3 cách trên GAE thế nào điều này có thể được giải quyết, nhưng có vẻ như chỉ là người cuối cùng (là phức tạp nhất) có thể là một giải pháp cho vấn đề của tôi:

  1. Sử dụng một bộ mô tả triển khai (<security-constraint> trong web.xml). Điều này là không tốt, vì những người dùng đó có quyền truy cập, ngay cả khi người xem đến trang quản trị của ứng dụng GAE, nơi họ có thể xem lịch sử thanh toán, duyệt Datastore, nhật ký, v.v ... và đây là điều tôi phải tránh.

  2. Sử dụng thông tin đăng nhập được liên kết (Mở ID) (https://developers.google.com/appengine/articles/openid) và cho phép người dùng sử dụng Google, Yahoo! hoặc các thông tin nhận dạng khác để đăng nhập. Nó không phải là một giải pháp, vì tôi muốn giới hạn quyền truy cập vào một nhóm nhỏ người dùng (tối đa 5) và không cho phép mọi người sử dụng ứng dụng.

  3. Các tùy chọn khác là tạo ra đơn giản trang đăng nhập tùy chỉnh chỉ có thể thông qua HTTPS và cho phép người dùng gửi mật khẩu Tên truy nhập & trong một yêu cầu POST (nó có thể được đơn giản vì chúng ta có an toàn kết nối https) vào một servlet, trên servlet tạo ra một số mã định danh phiên với giá trị được chỉ định và làm cho nó trở thành một phần của mọi yêu cầu tiếp theo. Nó cũng cần phải kiểm tra mỗi lần người dùng gửi một yêu cầu GET hoặc POST nếu mã định danh phiên tồn tại và không hết hạn trong khi đó theo cách thủ công.

Bất kỳ đề xuất nào khác/tốt hơn về cách duy trì tài khoản quản trị viên? Có thể HttpSession trợ giúp với biến thể cuối cùng không?

Kind Regards, Sten

+1

Bạn đang sắp xếp hai vấn đề hoàn toàn riêng biệt tại đây, xác thực và ủy quyền. Bạn có thể kết hợp một trong hai giải pháp (xác thực) đầu tiên với giải pháp của riêng bạn để kiểm tra ủy quyền. Cách dễ nhất để thực hiện việc này là duy trì danh sách người dùng được phép trong kho dữ liệu và tra cứu người dùng khi họ đăng nhập để kiểm tra các quyền, như Peter và Adam đề xuất bên dưới. –

Trả lời

1

tôi sử dụng một sự kết hợp của 2 và 3. Tôi cho phép tất cả người dùng để đăng nhập, nhưng sau đó tôi hạn chế hành động đến các địa chỉ e-mail riêng. Chúng có thể được mã hóa cứng hoặc (tốt hơn) trong kho dữ liệu và memcache (để bạn không phải truy vấn kho dữ liệu theo mọi yêu cầu). Bạn cũng có thể lưu dữ liệu này trong các biến tĩnh trong Java nếu bạn muốn - chỉ cần lưu ý rằng bạn có thể cần phải hủy bỏ các cá thể bằng tay nếu bạn thay đổi người dùng có quyền truy cập. Nếu, như tôi, bạn hiếm khi/không bao giờ thay đổi quyền truy cập thì đây không phải là vấn đề.

Cho phép tất cả người dùng đăng nhập thực sự không cho họ truy cập vào ứng dụng của tôi - họ thấy các trang quản trị nhưng chúng trống ngoài thông báo "Bạn không có quyền truy cập vào bất kỳ tùy chọn quản trị nào".

+0

Có ai có thể chia sẻ một số mã mẫu cho điều này ở phía Servlet không? – Axwack

1

Một số lưu ý:

  1. AFAIK giả định của bạn là không đúng. Đăng nhập vào ứng dụng không liên quan gì đến quyền quản trị trang. Bạn cần thêm người dùng một cách rõ ràng qua trang "Quyền" để họ có quyền truy cập vào trang quản trị.

  2. Bạn vẫn có thể kiểm tra thuộc tính người dùng (email) sau khi người dùng đăng nhập bằng OpenID và từ chối họ truy cập.

  3. Đây là tất nhiên có thể thực hiện được. Cách tự nhiên để theo dõi người dùng là sessions. Google cho các ví dụ.

Trong cả hai trường hợp 2. '3. nó khuyến khích để có một bộ lọc servlet để kiểm tra phiên nếu có người sử dụng đăng nhập và từ chối truy cập (trở 404) nếu người dùng không đăng nhập.

1

tôi đề xuất trang đăng nhập Google chuẩn. Sử dụng một cái gì đó như thế này trong bạn điều khiển xác thực (Java + Jersey khung đó là tất nhiên không cần thiết):

@Path("/login") 
public Response login(@Context UriInfo ui) throws Exception { 
    UserService userService = UserServiceFactory.getUserService(); 
    com.google.appengine.api.users.User user = userService.getCurrentUser(); 
    Response response; 
    if (user == null) { 
    URI uri = new URI(userService.createLoginURL(ui.getBaseUri().toString())); 
    response = Response.seeOther(uri).build(); 
    } else { 
    URI uri = new URI("/"); 
    response = Response.seeOther(uri).build(); 
    } 
    return response; 
} 

@GET 
@Path("/logout") 
public Response logout(@Context UriInfo ui) throws Exception { 
    UserService userService = UserServiceFactory.getUserService(); 
    com.google.appengine.api.users.User user = userService.getCurrentUser(); 
    Response response; 
    if (user == null) { 
    URI uri = new URI("/"); 
    response = Response.seeOther(uri).build(); 
    } else { 
    URI uri = new URI(userService.createLogoutURL(ui.getBaseUri().toString())); 
    response = Response.seeOther(uri).build(); 
    } 
    return response; 
} 

Phương pháp đăng nhập chuyển hướng bạn ứng dụng vào trang đăng nhập Google nếu người dùng đang missin (thực chất chưa đăng nhập) . Phương thức đăng xuất sẽ đăng xuất người dùng.

Hope this helps chú ý

0

Pay đến giải pháp thứ 3: thay vì đi qua tên & mật khẩu webapp của tôi hỏi tên & apiSecret (được tạo ra tự động đăng nhập đầu tiên), vì vậy bạn có thể làm mất hiệu lực (và tái tạo) một cách nhanh chóng apiSecret nếu xảy ra sự cố.

Có một tùy chọn khác: OAuth (https://developers.google.com/appengine/docs/java/oauth/). Đây là đoạn mã của tôi (UserAccount là lớp của tôi để đại diện cho Người dùng; Người dùng là "com.google.appengine.api.users.User", retrieveUser (..) là chức năng truy xuất Tài khoản Người dùng của tôi từ Người dùng đã đăng nhập "):

public UserAccount getUserLogged(HttpServletRequest request) { 
    try { 
     User loggedUser = oauthService.getCurrentUser(); 
     if(loggedUser!=null) { 
      return super.userAB.retrieveUser(loggedUser); 
     } 
    } catch (OAuthRequestException e) { 
     return null; 
    } 
    return null; 
}