2011-10-25 33 views
25

Đây phải là một vấn đề phổ biến ... và tôi cảm thấy rằng sau khi googling, và SOing tôi phải có chỉ cần không nhìn xung quanh kỹ lưỡng cho câu trả lời đủ hoặc no1 đã yêu cầu nó ... vì vậy xin vui lòng tha thứ cho tôi.Làm thế nào để tải lại Spring Security Principal sau khi cập nhật trong Hibernate?

Tôi đang sử dụng Xuân An với Hibernate, vv

Vì vậy, một tài khoản/chính đã đăng nhập và thực hiện một số thay đổi hồ sơ của họ.

Tôi sử dụng DAO để cập nhật hồ sơ (UserDetails) và tôi muốn Hiệu trưởng tự động phản ánh bản cập nhật này.

Tuy nhiên khi tôi nhận lại Hiệu trưởng, tôi nhận được phiên bản bẩn (từ lần đăng nhập đầu tiên của tôi).

Có ai biết cách tôi có thể nhận được Spring Security để tải lại từ Hibernate UserDetails được cập nhật không?

+0

OK Tôi đã tìm thấy thứ gì đó đã giúp tôi http://stackoverflow.com/questions/2398224/spring-security-autowire-providermanager Nhận Trình quản lý nhà cung cấp cho phép tôi xác thực lại. Bây giờ vấn đề có vẻ như là Hiệu trưởng mới có tất cả các tham chiếu ngoại vi lười được khởi tạo khiến nó ném thêm các ngoại lệ xuống dòng – alwinc

+0

Đó thực sự là vấn đề chiến lược Hibernate/ORM, và không quá nhiều vấn đề về bảo mật Spring ... đúng? –

+1

Vâng, tôi đã xem xét kỹ hơn một chút và có vẻ như Spring Sec làm cho UserDetails miễn dịch vì lý do bảo mật. Như vậy, cách tốt nhất là đăng nhập lại userdetails bằng cách buộc họ nhập lại mật khẩu của họ. – alwinc

Trả lời

41

OK đào xung quanh và cuối cùng tìm thấy câu trả lời.

Chúng tôi có thể tạo một UsernamePasswordAuthenticationToken và gán Hiệu trưởng được cập nhật cho ngữ cảnh.

Authentication authentication = new UsernamePasswordAuthenticationToken(userObject, userObject.getPassword(), userObject.getAuthorities()); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

Xem thêm "How to manually set an authenticated user in Spring Security/SpringMVC".

+6

Giải pháp của bạn hoạt động. Tuy nhiên, tôi sẽ sử dụng 'PreAuthenticatedAuthenticationToken' thay vì' UsernamePasswordAuthenticationToken'. Điều này về cơ bản làm điều tương tự - nó chỉ giúp làm rõ mục đích của bạn và tăng cường khả năng đọc mã của bạn –

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