Tôi đang làm việc để tích hợp Spring Security SAML Extension với Spring Boot.An mùa xuân trên Wildfly/Undertow: Lỗi thực hiện chuỗi lọc
tôi đã phát triển một ứng dụng mẫu hoàn chỉnh, tất cả các mã nguồn được công bố trên GitHub:
Bằng cách chạy các WebApp như ứng dụng Spring Boot (qua mùa xuân Tool Set, bởi sử dụng Máy chủ ứng dụng nhúng), nó hoạt động tốt. Thật không may, quá trình xác thực không hoạt động trên Undertow/WildFly (và tôi phải sử dụng nó làm AS sản xuất).
Bằng cách ghi nhật ký, tôi có thể thấy rằng IdP thực hiện quy trình AuthN và hướng dẫn triển khai UserDetails
tùy chỉnh của tôi được thực thi chính xác. Mặc dù Spring không thiết lập các đặc quyền cho người dùng hiện tại.
@Component
public class SAMLUserDetailsServiceImpl implements SAMLUserDetailsService {
// Logger
private static final Logger LOG = LoggerFactory.getLogger(SAMLUserDetailsServiceImpl.class);
@Override
public Object loadUserBySAML(SAMLCredential credential)
throws UsernameNotFoundException, SSOUserAccountNotExistsException {
String userID = credential.getNameID().getValue();
if (userID.compareTo("[email protected]") != 0) { // We're simulating the data access.
LOG.warn("SSO User Account not found into the system");
throw new SSOUserAccountNotExistsException("SSO User Account not found into the system", userID);
}
LOG.info(userID + " is logged in");
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER");
authorities.add(authority);
ExtUser userDetails = new ExtUser(userID, "password", true, true, true,
true, authorities, "John", "Doe");
return userDetails;
}
}
Bằng cách gỡ lỗi, tôi đã kiểm tra sự cố bắt đầu từ lớp FilterChainProxy
. Khi tôi chạy ứng dụng web trên WildFly, tôi có thể thấy thuộc tính FILTER_APPLIED
của ServletRequest
là null, do đó, Spring xóa SecurityContextHolder
.
private final static String FILTER_APPLIED = FilterChainProxy.class.getName().concat(".APPLIED");
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
if (clearContext) {
try {
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
doFilterInternal(request, response, chain);
} finally {
SecurityContextHolder.clearContext();
request.removeAttribute(FILTER_APPLIED);
}
} else {
doFilterInternal(request, response, chain);
}
}
On VMware vFabric tc Sever và Tomcat điều đó không xảy ra. Có cách nào để giải quyết vấn đề này không?
Trong hầu hết các trường hợp, 'SecurityContextHolder' nên xóa sau khi yêu cầu. Mục đích duy nhất của mã đó là trong trường hợp chuỗi bộ lọc được áp dụng nhiều lần trong cùng một yêu cầu (trong trường hợp đó, chỉ có chuỗi gốc nên xóa ngữ cảnh). Vì vậy, tôi không nghĩ đó là một vấn đề. –
BTW, hành vi này gây thương tích cho quá trình đăng nhập mỗi lần. Có cách nào để sửa chữa nó, ví dụ bằng cách cấu hình đúng phần mềm của tôi của AS? – vdenotaris
Không chắc chắn ý của bạn là gì. Hành vi nào, và nó làm mất hiệu lực thông tin đăng nhập như thế nào? Xóa ngữ cảnh khi một luồng kết thúc xử lý một yêu cầu là hành vi bình thường - nó là điều cần thiết để ngăn chặn rò rỉ dữ liệu thread-local trở lại một nhóm luồng. Tại thời điểm đó bối cảnh thường nên được lưu trữ trong phiên của người dùng. Vì vậy, nó không nên làm mất hiệu lực đăng nhập. –