tôi sử dụng SecurityContextHolder
và một tùy chỉnh để có được UserDetailsService
UserDetails
từ SecurityContextHolder
:Có phải SecurityContextChủ đề an toàn không?
Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetailsDTO user = (UserDetailsDTO) o;
tôi rời ra kiểm tra null, vv, nhưng đó là ý tưởng. Tôi đang sử dụng này trong một @Around
pointcut của một @Aspect
:
@Around("execution(* user.service.*.*(..))")
public Object audit(ProceedingJoinPoint call) throws Throwable {
// get user id
// add audit row in db
}
Nhìn vào lớp SecurityContextHolder
, nó sử dụng một ThreadLocal
theo mặc định, nhưng những thứ pointcut cũng dường như có một số loại của logic luồng đóng gói.
Có thể có thể xảy ra xung đột người dùng (tức là truy cập UserA từ một phiên cho sự kiện kiểm toán UserB trong một phiên đồng thời khác) hoặc có thể là người dùng rỗng hoàn toàn.
Có cách nào tốt hơn để lấy thông tin xác thực/hồ sơ người dùng không?
Tôi thấy điều đó, nhưng con người làm điều đó có vẻ giống như một miscue khổng lồ cho các chàng trai mùa xuân. Một lớp util tĩnh, và setStrategyName có sự xáo trộn Javadoc này: 'KHÔNG gọi phương thức này nhiều hơn một lần cho một JVM đã cho, vì nó sẽ khởi tạo lại chiến lược và ảnh hưởng xấu đến bất kỳ chủ đề hiện có nào bằng chiến lược cũ. cuối cùng tạo ra một lớp wrapper singleton. – Droo
Tôi đoán rằng đó cũng là thuộc tính hệ thống: 'chuỗi cuối cùng tĩnh công cộng SYSTEM_PROPERTY =" spring.security.strategy ";' – Droo