2011-08-24 26 views
8

Trong SpringSecurity nó có một tên lớp SecurityContextHolder và spec của nó: 'Liên kết một SecurityContext cho trước với chuỗi thực hiện hiện hành.' Với ứng dụng web bất cứ khi nào một yêu cầu đến máy chủ thì Spring cũng tải lại và thiết lập SecurityContext của yêu cầu đó trong SecurityContextHolder cho chủ đề của nó?Bảo mật mùa xuân quản lý SecurityContext trong một chuỗi qua các yêu cầu ứng dụng web như thế nào?

+0

Xin xem http://stackoverflow.com/questions/6408007/spring-securitys-securitycontextholder-session-or-request-bound – Ritesh

Trả lời

7

Với ứng dụng web bất cứ khi nào có yêu cầu đến máy chủ thì Spring cũng tải lại và đặt SecurityContext của yêu cầu đó trong SecurityContextHolder cho chuỗi của nó?

Về cơ bản có.

Hành vi mặc định là SecurityContextHolder.getInstance() là trả về phiên bản SecurityContextHolder mà nó được lưu trữ dưới dạng chuỗi nội tuyến của chuỗi hiện tại. (Đây chỉ là cơ chế mặc định. Bạn có thể sử dụng một chiến lược khác nhau để định vị các SecurityContextHolder bằng cách gọi SecurityContextHolder.setStrategemName())

Một bộ lọc SpringSecurity đảm bảo rằng các nhân yêu cầu SecurityContextHolder (tuy nhiên nó nằm) được nạp với các thông tin yêu cầu vào lúc bắt đầu và rằng chủ sở hữu sẽ bị xóa khi kết thúc xử lý yêu cầu.

+0

Xây dựng, chìa khóa là bộ lọc trông trong invocation từ xa thuộc tính đối với an ninh bối cảnh. Chỉ khi một ngữ cảnh bảo mật nằm trong các thuộc tính gọi từ xa, nó có thể được đặt trong SecurityContextHolder. Ngữ cảnh bảo mật này thường được cung cấp từ máy khách với một bộ lọc tương tự xử lý lời gọi đi và đặt ngữ cảnh bảo mật từ luồng cục bộ vào lời gọi từ xa. – Zach

+0

[Tại sao điều này không hoạt động] (https://github.com/spring-projects/spring-security/issues/3919) cho tôi? Xem [câu hỏi stackoverflow] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not-shared-across-thread). – displayname

9

Có, số SecurityContextPersistenceFilter sẽ giải quyết vấn đề này. Theo mặc định, nó định vị SecurityContext trong HttpSession và liên kết nó với luồng thông qua SecurityContextHolder. Khi yêu cầu được xử lý xong, nó đảo ngược - nó lấy SecurityContext từ chuỗi và đặt nó trong phiên.

Từ Javadoc:

populates SecurityContextHolder với thông tin thu được từ cấu hình SecurityContextRepository trước khi yêu cầu và các cửa hàng nó trở lại trong kho một khi yêu cầu đã hoàn thành và thanh toán bù trừ người giữ bối cảnh. Theo mặc định, nó sử dụng một HttpSessionSecurityContextRepository.

+0

Không nên làm cho nó cũng là chủ đề an toàn? Có vẻ như 'SecurityContext' không được chia sẻ qua các luồng trong ứng dụng của tôi ([link] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not -chia-qua-chủ đề)). – displayname

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