2009-08-24 36 views
16

Tôi đang cố gắng tích hợp Spring Security trong ứng dụng web của mình. Nó có vẻ khá dễ dàng để làm miễn là bạn tích hợp toàn bộ quá trình xác thực và ủy quyền.bảo mật mùa xuân: ủy quyền mà không cần xác thực

Tuy nhiên, cả xác thực và ủy quyền dường như quá hợp lý nên tôi rất tốn thời gian để hiểu cách tôi có thể tách các quy trình này và nhận xác thực độc lập với ủy quyền.

Quy trình xác thực nằm ngoài hệ thống của chúng tôi (dựa trên đăng nhập một lần) và điều này không thể sửa đổi được. Tuy nhiên, khi người dùng thành công quá trình này, nó được tải trong phiên, bao gồm cả vai trò.

Những gì chúng tôi đang cố gắng đạt được là sử dụng thông tin này cho quy trình ủy quyền của Spring Security, điều đó có nghĩa là buộc phải nhận vai trò từ phiên người dùng thay vì chọn nó thông qua nhà cung cấp xác thực .

Có cách nào để đạt được điều này không?

+0

Tôi đã cập nhật câu trả lời của mình. –

Trả lời

18

Nếu xác thực của bạn đã được thực hiện bằng dịch vụ SSO, thì bạn nên sử dụng một trong số bảo mật mùa xuân pre-authentication filters. Sau đó, bạn có thể chỉ định một dịch vụ UserDetails (có thể tùy chỉnh) mà sẽ sử dụng các nguyên tắc sử dụng trước khi chứng thực để cư trú của GrantedAuthority

SpringSecurity bao gồm một số bộ lọc trước khi xác thực bao gồm J2eePreAuthenticatedProcessingFilter và RequestHeaderPreAuthenticatedProcessingFilter. Nếu bạn không thể tìm được cái nào phù hợp với bạn, nó cũng có thể, và không khó để viết cho riêng bạn, miễn là bạn biết nơi nào trong yêu cầu thực hiện SSO của bạn sẽ lấy dữ liệu. (Điều đó phụ thuộc vào việc thực hiện các khóa học.)

Chỉ cần thực hiện các giao diện Filter và làm điều gì đó như thế này trong phương thức doFilter:

public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 

    // principal is set in here as a header or parameter. you need to find out 
    // what it's named to extract it 
    HttpServletRequest req = (HttpServletRequest) request; 

    if (SecurityContextHolder.getContext().getAuthentication() == null) { 
     // in here, get your principal, and populate the auth object with 
     // the right authorities 
     Authentication auth = doAuthentication(req); 
     SecurityContextHolder.getContext().setAuthentication(auth); 
    } 

    chain.doFilter(request, response); 
} 
+0

hi nont, tôi đã làm việc về điều này. Câu trả lời của bạn rất hữu ích, mặc dù bây giờ tôi phải trì hoãn vấn đề này trong một vài ngày. Tôi sẽ trở lại với nó và cho bạn biết mọi thứ diễn ra như thế nào. cám ơn! – markitus82

+0

chào mừng bạn. chúc may mắn! – nont

+0

Điều này không đủ cho ứng dụng của chúng tôi ... Tôi cũng được yêu cầu thêm SecurityContext vào phiên như sau: session.setAttribute (HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext()); –

3

Có, có thể. Spring Security (giống như hầu hết phần còn lại của Spring) là giao diện điều khiển để bạn có thể cắm vào các triển khai của riêng bạn một cách có chọn lọc cho các phần khác nhau của khung công tác.

Cập nhật: Cơ chế xác thực và xác thực của Spring hoạt động cùng nhau - cơ chế xác thực sẽ xác thực người dùng và chèn GrantedAuthority trường hợp khác nhau trong ngữ cảnh bảo mật. Sau đó, máy sẽ được kiểm tra bởi máy móc ủy quyền để cho phép/không cho phép các hoạt động nhất định.

Sử dụng câu trả lời của nont để biết chi tiết về cách sử dụng xác thực từ trước. Các chi tiết về cách bạn nhận được các chi tiết từ phiên của bạn (ví dụ: vai trò) tất nhiên sẽ phụ thuộc vào thiết lập cụ thể của bạn. Nhưng nếu bạn đặt trong các trường hợp GrantedAuthority bắt nguồn từ các vai trò được điền sẵn trong phiên của bạn bởi hệ thống SSO của bạn, bạn sẽ có thể sử dụng chúng trong logic ủy quyền của mình.

Từ các tài liệu tham khảo (hơi thay đổi nội dung, với sự nhấn mạnh của tôi):

Bạn có thể (và nhiều người dùng) viết bộ lọc riêng của họ hoặc bộ điều khiển MVC để cung cấp khả năng tương tác với hệ thống xác thực mà không phải là dựa trên Spring Security. Ví dụ: bạn có thể đang sử dụng Xác thực vùng chứa được quản lý làm cho người dùng hiện tại có sẵn từ địa chỉ ThreadLocal hoặc JNDI. Hoặc bạn có thể làm việc cho một công ty có hệ thống xác thực độc quyền di sản , là một tiêu chuẩn "công ty" mà bạn có ít quyền kiểm soát. Trong các trường hợp như vậy , thật dễ dàng để có được Bảo mật mùa xuân hoạt động và vẫn còn cung cấp khả năng ủy quyền. Tất cả bạn cần làm là viết một bộ lọc (hoặc tương đương) mà đọc thông tin người dùng của bên thứ ba từ một địa điểm , xây dựng một đối tượng Xuân an ninh cụ thể Authentication , và đặt nó vào SecurityContextHolder. Nó khá dễ dàng để làm điều này, và nó là một cách tiếp cận tích hợp được hỗ trợ đầy đủ .

+0

nhưng có cần phải định cấu hình Trình xác thực không? – markitus82

+0

Có nhưng điều đó không phải là một đối tượng khác thì nhà cung cấp ủy quyền: Bạn có thể tạo một lớp thực hiện cả hai (vì hệ thống SSO của bạn dường như cung cấp cho bạn cả hai). –

+0

điều là biểu mẫu đăng nhập (xác thực) trong ứng dụng của tôi được thực hiện bởi các hệ thống bên ngoài. tất cả những gì tôi có là phiên người dùng và người dùng đã được xác thực. Tôi muốn biết làm thế nào tôi có thể nhận được userId và vai trò từ phiên để sử dụng Spring Authorization. – markitus82

2

Máy chủ xử lý xác thực sẽ chuyển hướng người dùng đến ứng dụng chuyển đến một loại khóa nào đó (mã thông báo trong CAS SSO). Sau đó, ứng dụng sử dụng khóa để yêu cầu máy chủ xác thực tên người dùng và vai trò được liên kết. Với thông tin này, hãy tạo ngữ cảnh bảo mật được chuyển tới trình quản lý ủy quyền. Đây là một phiên bản rất đơn giản của luồng công việc đăng nhập SSO.
Hãy xem CAS SSOCAS 2 Architecture.
Hãy cho tôi biết nếu bạn cần thêm thông tin.

1

chúng tôi đã yêu cầu cùng một nơi mà chúng tôi đã phải sử dụng bảo mật mùa xuân cho chỉ mục đích ủy quyền. Chúng tôi đã sử dụng Siteminder để xác thực. Bạn có thể tìm thêm chi tiết về làm thế nào để sử dụng ủy quyền một phần của an ninh mùa xuân không xác thực ở đây tại http://codersatwork.wordpress.com/2010/02/13/use-spring-security-for-authorization-only-not-for-authentication/

Tôi cũng đã thêm mã và kiểm tra các trường hợp nguồn tại http://code.google.com/p/spring-security-with-authorization-only/source/browse/

1

Tôi cố gắng để hiểu được xác thực CAS với Authorization của riêng của chúng tôi và đã bị lẫn lộn vì đối tượng User trong Spring Security luôn mong đợi mật khẩu được điền vào và chúng tôi không quan tâm đến điều đó trong kịch bản của chúng tôi. Sau khi đọc bài viết của Surabh, có vẻ như thủ thuật là trả về một đối tượng User tùy chỉnh mà không cần mật khẩu điền vào. Tôi sẽ thử nó và xem nó có hoạt động trong trường hợp của tôi hay không. Hy vọng rằng không có mã nào khác trong chuỗi sẽ mong đợi mật khẩu trong đối tượng User.

1

tôi sử dụng uỷ quyền của thành viên này:

  1. Tiêm đậu uỷ quyền liên quan vào đậu của riêng tôi:

    @Autowired 
    private AccessDecisionManager accessDecisionManager; 
    @Autowired 
    FilterSecurityInterceptor  filterSecurityInterceptor; 
    
  2. Sử dụng đậu này của thành viên này:

    FilterInvocation fi = new FilterInvocation(rundata.getRequest(), rundata.getResponse(), new FilterChain() { 
    
        public void doFilter(ServletRequest arg0, ServletResponse arg1) throws IOException, ServletException { 
         // TODO Auto-generated method stub 
    
        } 
    }); 
    FilterInvocationDefinitionSource objectDefinitionSource = filterSecurityInterceptor.getObjectDefinitionSource(); 
    ConfigAttributeDefinition attr = objectDefinitionSource.getAttributes(fi); 
    Authentication authenticated = new Authentication() { 
    
        ........... 
    
        public GrantedAuthority[] getAuthorities() { 
         GrantedAuthority[] result = new GrantedAuthority[1]; 
         result[0] = new GrantedAuthorityImpl("ROLE_USER"); 
         return result; 
        } 
    }; 
    accessDecisionManager.decide(authenticated, fi, attr); 
    
Các vấn đề liên quan