Công ty của tôi đã đánh giá Spring MVC để xác định xem chúng tôi có nên sử dụng nó trong một trong các dự án tiếp theo của chúng tôi hay không. Cho đến nay tôi yêu những gì tôi đã thấy, và ngay bây giờ tôi đang xem xét mô-đun bảo mật mùa xuân để xác định xem đó là một cái gì đó chúng ta có thể/nên sử dụng.Thử nghiệm đơn vị với Spring Security
Yêu cầu bảo mật của chúng tôi khá cơ bản; người dùng chỉ cần có thể cung cấp tên người dùng và mật khẩu để có thể truy cập một số phần nhất định của trang web (chẳng hạn như để nhận thông tin về tài khoản của họ); và có một số ít trang trên trang web (FAQs, Support, v.v.) nơi người dùng ẩn danh sẽ được cấp quyền truy cập.
Trong nguyên mẫu tôi đã tạo, tôi đã lưu trữ một đối tượng "LoginCredentials" (chỉ chứa tên người dùng và mật khẩu) trong phiên cho người dùng được xác thực; một số điều khiển kiểm tra để xem nếu đối tượng này là trong phiên để có được một tham chiếu đến tên người dùng đăng nhập, ví dụ. Tôi đang tìm cách thay thế logic gia đình này bằng Spring Security để thay thế, điều này sẽ có lợi ích to lớn khi xóa bất kỳ loại "làm cách nào chúng tôi theo dõi người dùng đã đăng nhập?" và "cách chúng tôi xác thực người dùng?" từ bộ điều khiển/mã kinh doanh của tôi.
Nó có vẻ như mùa xuân Security cung cấp một "bối cảnh" đối tượng (mỗi chủ đề) để có thể truy cập vào username/thông tin chủ yếu từ bất cứ nơi nào trong ứng dụng của bạn ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... mà dường như rất un-Spring giống như đối tượng này là một singleton (toàn cầu), theo một cách nào đó. Câu hỏi của tôi là: nếu đây là cách tiêu chuẩn để truy cập thông tin về người dùng đã được xác thực trong Spring Security, cách được chấp nhận để đưa một đối tượng Authentication vào SecurityContext để nó có sẵn cho các bài kiểm tra đơn vị của tôi là gì khi kiểm tra đơn vị yêu cầu người dùng đã được xác thực?
Tôi có cần phải thiết lập dây này theo phương pháp khởi tạo của từng trường hợp thử nghiệm không?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Điều này có vẻ quá chi tiết. Có cách nào dễ hơn không?
Đối tượng SecurityContextHolder
chính nó có vẻ rất un-Xuân-like ...
Cảm ơn, đây là lời khuyên hữu ích. Những gì tôi đã làm cho đến nay là về cơ bản để tiến hành với gọi SecurityContextHolder.getContext() (thông qua một vài phương pháp wrapper của riêng tôi, vì vậy ít nhất nó chỉ được gọi là từ một lớp). –
Mặc dù chỉ là một lưu ý - Tôi không nghĩ rằng ServletContextHolder có bất kỳ khái niệm nào về HttpSession hoặc một cách để biết liệu nó có hoạt động trong môi trường máy chủ web hay không. InheritableThreadLocal và Global) –
Hạn chế duy nhất đối với việc sử dụng bean/session-scoped trong Spring là chúng sẽ thất bại trong một bài kiểm tra JUnit. Những gì bạn có thể làm là triển khai phạm vi tùy chỉnh sẽ sử dụng phiên/yêu cầu nếu có và quay trở lại chuỗi là cần thiết. Tôi đoán là Spring Security đang làm một cái gì đó tương tự ... –