2011-02-04 41 views
5

Trong nhà cung cấp xác thực tùy chỉnh của tôi, tôi có thể lấy đối tượng miền thông qua API dịch vụ của mình, nhưng khi tôi thu thập thông tin từ đối tượng miền này sang đối tượng khác để nhận giá trị nhất định để thực hiện kiểm tra bổ sung, Spring phàn nàn phiên Hibernate không tồn tại: -Gói nhà cung cấp xác thực tùy chỉnh bảo mật Spring với giao dịch

domain.getAnotherDomain().getProperty(); // epic FAIL 

tôi có giao dịch AOP sau để quấn tất cả các API dự án của tôi với giao dịch, và tôi chắc rằng nhà cung cấp chứng thực tùy chỉnh của tôi rơi vào mô hình sau: -

<tx:advice id="txAdvice"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 

<aop:config> 
    <aop:advisor pointcut="execution(* my.project..*.*(..))" advice-ref="txAdvice" /> 
</aop:config> 

Tôi cũng có bộ lọc OpenSessionInView được cấu hình, nhưng tôi không nghĩ rằng áp dụng cho Spring Security anyway.

Tôi đoán tôi có thể tạo một API dịch vụ cụ thể để thực hiện tất cả các kiểm tra bắt buộc, nhưng tôi tò mò tại sao tôi không thể gói nhà cung cấp xác thực tùy chỉnh của mình với giao dịch thích hợp.

Mọi lời giải thích? Cảm ơn.

Trả lời

2

Giải pháp khắc phục sự cố của tôi là tạo một API dịch vụ để thực hiện các kiểm tra nhằm tránh các lỗi tải chậm trong nhà cung cấp xác thực tùy chỉnh của tôi.

1

Xuân phàn nàn phiên Hibernate không tồn tại

Không khá chắc chắn tôi làm theo tất cả câu hỏi của bạn, nhưng tôi nghĩ rằng tuyên bố trên đại diện cho vấn đề chính của bạn, phải không? Bạn không cung cấp bất kỳ stacktrace nào, nhưng tôi cho rằng đây là "không có phiên hoặc phiên bị đóng" nổi tiếng, điển hình của kịch bản bạn vừa mô tả:

domain.getAnotherDomain(). GetProperty(); // epic FAIL

Có thể tôi đang thiếu điều gì đó, nhưng tôi nghĩ câu trả lời điển hình sẽ áp dụng ở đây: lập bản đồ mối quan hệ của bạn với fetch=FetchType.EAGER, để bạn không phải tải nó khi phiên đã đã đóng cửa.

+0

Thông báo ngoại lệ là 'không thể khởi tạo một tập hợp vai trò: ss.domain, không phiên hoặc phiên nào bị đóng'. Tôi không muốn thực hiện tìm nạp háo hức trừ khi tuyệt đối cần thiết ... nghĩa là, nếu tôi nhận được giao dịch để gói lớp nhà cung cấp xác thực tùy chỉnh. – limc

+0

Vâng, nếu bạn nạp 'miền' trong một phiên, bạn sẽ không thể tải một cách lười biếng' anotherDomain' từ 'miền' trong một phiên khác. Tôi không chắc chắn đây sẽ là trường hợp của bạn, mặc dù (nó không rõ ràng với tôi từ câu hỏi của bạn). Nhưng bạn có thể cân nhắc sử dụng Hồ sơ tìm nạp, nếu bạn không muốn luôn tải xuống Eager, nhưng bạn biết rằng đôi khi bạn cần. – jpkrohling

0

Tôi đã gặp phải sự cố tương tự này và nguyên nhân là do bộ lọc của Spring Security được khai báo trước bộ lọc OpenSessionInView trong tệp web.xml. Khi tôi đổi chỗ họ, vấn đề đã biến mất.

Lý do là vì Bảo mật mùa xuân đang được gọi trước khi phiên Hibernate được mở bằng bộ lọc OpenSessionInView và do đó không có phiên nào được mở.

0

Bạn chưa đăng bất kỳ mã nào cho phép chúng tôi thực hiện bất kỳ đề xuất có ý nghĩa nào.

Nhưng một vấn đề với nhà cung cấp xác thực tùy chỉnh có thể là bạn có thể được đánh dấu là @Transactional là phương pháp trừu tượng mà bạn đang ghi đè và đang được gọi từ cá thể lớp trừu tượng.

Ví dụ: retreiveUser từ AbstractUserDetailsAuthenticationProvider. Phương thức này được gọi từ bên trong cá thể (xem phương thức xác thực) và do đó không thể khởi tạo giao dịch thông qua cơ chế proxy AOP.Để biết thêm chi tiết, hãy kiểm tra @Transactional method calling another method without @Transactional anotation?

Mô hình giao dịch khai báo mùa xuân sử dụng proxy AOP. vì vậy proxy AOP có trách nhiệm tạo các giao dịch. Proxy AOP sẽ chỉ hoạt động nếu các phương thức có trong cá thể được gọi từ bên ngoài cá thể.

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