2013-11-28 14 views
6

Tôi muốn biết liệu có thể thiết lập vai trò dựa trên danh mục đã chọn hay không. Trong ứng dụng của chúng tôi có các danh mục chứa bài viết. Bây giờ chúng tôi có một hệ thống phân cấp vai trò như thế này: ROLE_ADMIN > ROLE_EDITOR > ROLE_USER. Vấn đề là người dùng có thể có các vai trò khác nhau dựa trên danh mục hiện được chọn:Làm cách nào để thay đổi vai trò của Spring Security theo ngữ cảnh?

user1 - cat1 - ROLE_USER 

user1 - cat2 - ROLE_EDITOR 

Danh mục không tĩnh. Những cái mới có thể được thêm vào và cũ hơn đã bị xóa. Có thể đạt được điều này bằng cách sử dụng Spring Security không?

+1

Bạn có thể giải thích cách bạn định sử dụng "danh mục" không? –

+0

Danh mục là một thực thể chứa một tập hợp các thực thể bài viết. Nó được chọn khi người dùng đang điều hướng qua ứng dụng. – Stefan

Trả lời

6

Từ mô tả của bạn, có vẻ như mô hình RBAC mà Spring Security cung cấp cho bạn là không đủ. Bạn có 2 tùy chọn có sẵn cho bạn. Hoặc:

  1. bạn tùy chỉnh Xuân An bằng cách thực hiện riêng Truy cập Quyết định quản lý của bạn (xem here để biết chi tiết) hoặc
  2. bạn di chuyển kiểm soát quyền truy cập vào thuộc tính dựa trên (aka ABAC như được giải thích bởi NIST here). Cách sử dụng ABAC trong Mùa xuân là sử dụng triển khai Java XACML, Ngôn ngữ đánh dấu kiểm soát truy cập eXtensible. XACML cung cấp cho bạn khung công tác ủy quyền dựa trên thuộc tính, bên ngoài và thuộc tính. Điều này có nghĩa là bạn có thể xác định các chính sách như người dùng có vai trò = người quản lý có thể thực hiện hành động = xem trong danh mục = foo. Bạn có thể có nhiều quy tắc tùy thích và kết hợp/yếu tố phù hợp.

Có một số mã nguồn mở và nhà cung cấp triển khai của XACML cho Java:

  • SunXACML
  • HerasAF
  • IBM
  • Axiomatics (từ chối trách nhiệm: các nhà cung cấp Tôi làm việc cho)

Nếu bạn muốn biết thêm thông tin về XACML, tôi sẽ ommend bạn hãy kiểm tra trang wikipedia của chúng tôi cũng như của chúng tôi channel YouTube có hướng dẫn trung lập của nhà cung cấp.

XACML có thể trở thành quá nhiều cho trường hợp sử dụng của bạn nhưng vẫn đáng xem xét.

+0

Cảm ơn bạn đã tặng kudo. –

0

Tôi không biết cách "danh mục" của bạn hoạt động, nhưng bạn có thể đặt "ROLE" thành đối tượng UserDetails.

Đối tượng UserDetails có phương pháp Collection<? extends GrantedAuthority> getAuthorities(); và "ROLE" là giá trị GrantedAuthority.getAuthority().

Vì vậy, bạn có thể đặt nhiều "ROLE" thành một phiên.

Và bạn có thể kiểm soát đối tượng UserDetails của mình bằng cách triển khai UserDetailsService.

-1

Trường hợp sử dụng này không thể thực hiện được bằng chức năng điều khiển truy nhập dựa trên vai trò mặc định (RBAC), vì quyền của người dùng đang thay đổi động trong thời gian chạy tùy thuộc vào một số dữ liệu liên quan đến người dùng.

Đây thực sự là trường hợp sử dụng Danh sách kiểm soát truy cập (ACLs) được thiết kế cho.

Bảo mật mùa xuân có hỗ trợ cho ACL bằng cách thêm bình xuân-acl.Đây là câu trích dẫn từ hướng dẫn bảo mật mùa xuân Phần Acl:

Các ứng dụng phức tạp thường sẽ thấy cần phải xác định quyền truy cập không đơn giản theo yêu cầu web hoặc cấp độ yêu cầu phương thức. Thay vào đó, các quyết định bảo mật cần bao gồm cả ai (Xác thực), nơi (MethodInvocation) và cái gì (SomeDomainObject). Nói cách khác, ủy quyền quyết định cũng cần phải xem xét đối tượng thực thể đối tượng miền thực tế của lời gọi phương thức.

Xem phần spring security manual 16.1 để biết chi tiết về cách ACL bảo mật mùa xuân hoạt động. Đây là tutorial về cách sử dụng ACL bảo mật mùa xuân.

Nhưng ACL mùa xuân ngụ ý 4 bảng cơ sở dữ liệu bổ sung, v.v ... vì vậy nếu đây là trường hợp duy nhất trong ứng dụng của bạn, tốt hơn hết là tạo trình quản lý quyết định tùy chỉnh với một số quy tắc bị bẻ khóa.

Nhưng nếu trường hợp sử dụng này thường xuyên trong ứng dụng của bạn, bạn nên cân nhắc chuyển sang ACL thay vì RBAC, hy vọng điều này sẽ hữu ích.

0

Tôi nghĩ mình hơi muộn ở đây nhưng đây là những gì làm việc cho tôi:

Khi một thể loại mới được chọn, bạn có thể thiết lập một đối tượng xác thực mới với vai trò mới trong phiên của bạn (Đối tượng thẩm định trước được không hợp lệ). Một cái gì đó như thế này:

@RequestMapping(value = "/cat1") 
String cat1(HttpServletRequest request) { 
    reloadRolesForAuthenticatedUser("cat1") 
    .... 
} 

private void reloadRolesForAuthenticatedUser(String cat) { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication() 
    List<String> newRoles = getRoles(auth.getPrincipal().getUsername(), cat) 
    List<GrantedAuthority> authorities = getAuthorities(newRoles) 
    Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(),auth.getCredentials(),authorities) 
    SecurityContextHolder.getContext().setAuthentication(newAuth) 
} 


private List<GrantedAuthority> getAuthorities(List<String> roles) { 
    List<GrantedAuthority> auths = new ArrayList<GrantedAuthority>() 
    if (!roles.isEmpty()) { 
     for (String r : roles) { 
      auths.add(new SimpleGrantedAuthority(r)) 
     } 
    } 
    return auths 
} 
Các vấn đề liên quan