2016-03-04 11 views
5

Chúng tôi có api spring spring api, sử dụng bảo mật mùa xuân và hibernate cho một db MySql.Thực hành tốt nhất để đảm bảo người dùng được ủy quyền được cấp quyền truy cập tài nguyên - Spring mvc, Spring Security, Hibernate

Chúng tôi có một số vai trò được định cấu hình. Ví dụ:

sử dụng tiêu chuẩn: ROLEA

siêu người dùng: ROLEB

Hiện nay để đảm bảo rằng một chứng thực người dùng được ủy quyền truy cập/cập nhật một nguồn lực nhất định chúng tôi làm điều gì đó như thế này:

Xác định người dùng được xác thực hiện tại:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
String activeLogin = authentication.getName(); 

Xác định tên đăng nhập liên quan đến việc tổ chức họ đang cố gắng truy cập:

String loginAssociatedToRequestedEntity = fooService.getEntityA(EntityAId).getEntityB().getEntityC().getLogin(); 

Hãy so sánh người sử dụng kết hợp với nguồn lực cho đăng nhập hoạt động:

if (!loginAssociatedToRequestedEntity.equals(activeLogin)) { 
throw new ForbiddenAccessException(); 
} 

Tôi có một số vấn đề với điều này, một số trong số này bao gồm:

  • Rất lãng phí ... mỗi thực thể sẽ phải được ngậm nước/dân cư. Điều này thậm chí còn tệ hơn ví dụ trên nếu thực thể được truy cập xa hơn so với bảng có tên đăng nhập.
  • Có vẻ như một mùi mã (Luật Demeter).
  • Yêu cầu có thể đến có thể cập nhật nhiều thực thể. Một kiểm tra tương tự như trên có thể phải được lặp lại.

Tôi đã xem xét những điều sau đây tùy chọn càng tốt:

Spring ACLs

Apache shiro

Vì vậy, câu hỏi của tôi là, là có một thực hành tốt nhất để đảm bảo một chứng thực sử dụng là được cấp phép để truy cập vào một tài nguyên nhất định tức là ngăn không cho chúng truy cập vào tài nguyên của người dùng khác có cùng vai trò.

Nếu bạn có thể chỉ ra một ví dụ cụ thể (github) sẽ được nhiều người đánh giá cao.

TIA.

Trả lời

7

Trong khi kiểm tra thành viên vai trò có phần chống mẫu (tốt hơn là viết mã cho quyền hoặc hoạt động), chúng thường được sử dụng để kiểm soát truy cập cấp dịch vụ (yêu cầu web & yêu cầu phương thức), nhưng không hoàn toàn phù hợp với để bảo vệ đối tượng miền thực trong cài đặt nhiều đối tượng thuê, ví dụ: để ngăn người dùng truy cập tài nguyên của người dùng khác có cùng vai trò.

Cách tiếp cận kiểm tra xem thông tin đăng nhập được xác thực có được liên kết với một đối tượng miền cụ thể không, nhưng các cặp vợ chồng và/hoặc làm ô nhiễm mô hình dữ liệu ứng dụng của bạn với mô hình dữ liệu bảo mật. thực hành.

Bạn đã xác định một số tùy chọn:

Apache Shiro cung cấp một API nhất quán và dễ sử dụng hỗ trợ điều khiển truy cập đối tượng miền, nhưng bạn có trách nhiệm cung cấp các phụ trợ "vương quốc", có nghĩa là bạn có thể phải triển khai kho dữ liệu và/hoặc DAO của riêng bạn.

ACL an toàn mùa xuân là mô hình kiểm soát truy cập của Spring để bảo mật đối tượng miền. Nó tách riêng mô hình dữ liệu bảo mật khỏi mô hình dữ liệu ứng dụng của bạn. Danh sách kiểm soát truy cập giúp dễ dàng cấp hoặc kiểm tra quyền truy cập vào các đối tượng miền bằng cách thêm hoặc tra cứu các mục ACL, nhưng bạn có thể cần phải viết DAO của riêng mình nếu bạn muốn tìm kiếm hiệu quả tất cả các đối tượng miền mà người dùng có quyền truy cập (ví dụ: các đối tượng trong danh sách hoặc thu hồi quyền truy cập vào chúng). Hơn nữa, bạn có trách nhiệm duy trì ACL vì:

Xuân An không cung cấp bất kỳ hội nhập đặc biệt để tự động tạo, cập nhật hoặc xóa ACL như một phần của DAO của bạn hoặc hoạt động kho. Thay vào đó, bạn sẽ cần phải viết mã [...] cho các đối tượng miền riêng của bạn. Bạn nên cân nhắc sử dụng AOP trên lớp dịch vụ của mình để tự động tích hợp thông tin ACL với các hoạt động của lớp dịch vụ của bạn.

Spring Security 4.0 reference

Cuối cùng, bạn sẽ phải tùy chỉnh việc thực hiện ACL nếu API mặc định là không tương thích với mô hình ứng dụng của bạn (ví dụ: nếu đối tượng tên miền của bạn không có một công getId() hoặc không sử dụng ID tương thích với long)

Nếu bạn chưa kết hôn với Spring hoặc Shiro để cung cấp điều khiển truy cập đối tượng miền, có một lựa chọn khác:

OACC, một mã nguồn mở Java khuôn khổ an ninh (tiết lộ: Tôi duy trì và đồng tác giả), mà cung cấp một API giàu cho cả thực thiquản lý nhu cầu uỷ quyền của bạn. OACC là một khung kiểm soát truy cập hoàn chỉnh với một API phong phú mà không yêu cầu bất kỳ việc triển khai DIY nào để cho phép mô hình hóa có lập trình và năng động của ủy quyền chi tiết. Nó có tính năng lưu trữ dữ liệu được hỗ trợ đầy đủ RDBMS cho mô hình bảo mật của nó, mà API quản lý cho bạn đằng sau hậu trường.

Mô hình bảo mật của OACC dựa trên quyền: về cơ bản nó quản lý các quyền giữa các tài nguyên .Tài nguyên đại diện cho cả hai đối tượng miền được bảo mật và các tác nhân trên chúng (tức là đối tượng). Nó cũng cung cấp các phương thức truy vấn hiệu quả để tìm tài nguyên theo sự cho phép, mà không tải tất cả các tài nguyên trước và sau đó lọc ra các tài nguyên trái phép. Các phương pháp này là đối xứng theo nghĩa là bạn có thể tìm thấy cả hai tài nguyên mà tài nguyên được chỉ định có một nhóm quyền cụ thể và tài nguyên có tập hợp quyền cụ thể đối với tài nguyên được chỉ định

So sánh đoạn OACC để cấp phép dưới đây với các sample code from the Spring Security ACL reference:

// get the resource representing the principal that we want to grant permissions to 
User accessorUser = Users.findByName("Samantha"); 
Resource accessorResource = Resources.getInstance(accessorUser.getId()); 

// get the resource representing the object that we want to grant permissions to 
Resource accessedResource = Resources.getInstance(Foos.findById(44).getId()); 

// Now grant some permissions 
Permission permission = ResourcePermissions.getInstance("ADMINISTER"); 
oacc.grantResourcePermissions(accessorResource, 
           accessedResource, 
           permission); 

để kiểm tra cho phép, bạn có thể gọi

oacc.assertResourcePermissions(accessorResource, accessedResource, permission); 

hoặc kiểm tra giá trị trở lại của

oacc.hasResourcePermissions(accessorResource, accessedResource, permission); 

Một tính năng mới của OACC là tạo-quyền, mà không chỉ kiểm soát những gì loại tài nguyên một chủ đề có thể tạo ra, mà còn xác định quyền chính xác những gì họ sẽ nhận được trên một tài nguyên mới sau khi tạo nó - được xác định một lần, quyền được tự động gán cho người tạo tài nguyên, mà không cần các cuộc gọi API rõ ràng.

Tóm lại, OACC được phát triển cụ thể với trường hợp sử dụng của bạn là xác thực, ủy quyền chi tiết, được ghi nhận.

+0

Chỉ muốn cảm ơn bạn đã trả lời. Tôi đã không có một cái nhìn kỹ lưỡng về oacc chưa ~ Tôi đã nhận được một chút bị mắc kẹt trên hướng dẫn khởi động ... – Hurricane

+0

Cảm thấy tự do để gửi một câu hỏi ở đây hoặc trên [danh sách gửi thư của OACC] (https://groups.google.com/ diễn đàn/#! forum/oacc-users), nếu bạn cần bất kỳ trợ giúp hoặc làm rõ – fspinnenhirn

0

Bạn có thể sử dụng dữ liệu Spring JPA để thêm thông tin chính của Spring Security vào các truy vấn SQL của bạn. Ví dụ:

https://github.com/spring-projects/spring-data-examples/blob/master/jpa/security/src/main/java/example/springdata/jpa/security/SecureBusinessObjectRepository.java

Bạn cũng có thể sử dụng một cơ sở dữ liệu như PostgreSQL 9.5, Oracle VPD hoặc SQL Server 2016 có Bảo mật hàng

+0

Cảm ơn Neil, chúng tôi hiện không sử dụng Dữ liệu mùa xuân, nhưng đây là điều tôi sẽ cân nhắc nếu chúng tôi chấp nhận trong tương lai. – Hurricane

Các vấn đề liên quan