Spring Security trên Wildfly: lỗi trong khi thực hiện chuỗi bộ lọc


194

Tôi đang cố gắng tích hợp Spring Security SAML Extension với Spring Boot .

Về vấn đề này, tôi đã phát triển một ứng dụng mẫu hoàn chỉnh. Mã nguồn của nó có sẵn trên GitHub:

Bằng cách chạy nó dưới dạng ứng dụng Spring Boot (chạy với Máy chủ ứng dụng tích hợp SDK), WebApp hoạt động tốt.

Thật không may, quá trình AuthN tương tự hoàn toàn không hoạt động trên Undertow / WildFly .

Theo nhật ký, IdP thực sự thực hiện quy trình AuthN : các hướng dẫn UserDetailsthực hiện tùy chỉnh của tôi được thực thi chính xác. Bất chấp luồng thực thi, Spring không thiết lập và duy trì 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("jdoe@samplemail.com") != 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;
    }
}

Trong khi gỡ lỗi, tôi phát hiện ra vấn đề phụ thuộc vào FilterChainProxylớp. Trong thời gian chạy, thuộc tính FILTER_APPLIEDcủa ServletRequestgiá trị 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);
    }
}

Trên VMware vFoven tc SeverTomcat , mọi thứ hoạt động hoàn toàn tốt. Bạn có bất cứ ý tưởng về việc giải quyết vấn đề này?


2
Trong hầu hết các tình huống, SecurityContextHoldercần được 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ỉ chuỗi gốc sẽ xóa ngữ cảnh). Vì vậy, tôi không nghĩ đó là một vấn đề.
Shaun the Sheep

2
BTW, hành vi này bất biến quá trình đăng nhập mỗi lần. Có cách nào để khắc phục nó không, ví dụ bằng cách cấu hình đúng phần mềm AS của tôi?
vdenotaris

1
Không chắc chắn những gì bạn có ý nghĩa bởi điều này. Hành vi gì, và làm thế nào để vô hiệu hóa đăng nhập? Xóa ngữ cảnh khi luồng xử lý kết thúc yêu cầu là hành vi bình thường - điều cần thiết là ngăn chặn rò rỉ dữ liệu cục bộ của luồng trở lại nhóm luồng. Tại thời điểm đó, bối cảnh thường sẽ đượ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.
Shaun the Sheep

2
Như đã mô tả ở trên, sau SSO, Máy chủ ứng dụng sẽ xóa dữ liệu phiên và dữ liệu xác thực. Điều này chỉ xảy ra với Wildfly: cùng một mã hoạt động tốt với Tomcat.
vdenotaris

11
SecurityContextHolder.clearContext()dữ liệu phiên không rõ ràng. Nó loại bỏ việc ThreadLocallưu trữ bối cảnh trước khi phát hành một luồng trở lại nhóm luồng. Quan điểm của tôi là điều này sẽ luôn xảy ra vào cuối yêu cầu, vì vậy những gì bạn đang thấy là bình thường và không có khả năng là nguyên nhân của vấn đề của bạn.
Shaun the Sheep

Câu trả lời:


7

Điều tra vấn đề tôi nhận thấy rằng có một số mớ hỗn độn với cookie và tham chiếu trong yêu cầu xác thực.

Hiện tại xác thực ruồi hoang dã sẽ hoạt động nếu bạn thay đổi bối cảnh ứng dụng web thành Ngữ cảnh gốc:

 <server name="default-server" default-host="webapp">
     <http-listener name="default" socket-binding="http"/>
     <host name="default-host" alias="localhost" default-web-module="sso.war"/>
 </server>

Sau khi khởi động lại wildfly và xóa cookie, tất cả sẽ hoạt động như mong đợi


Giải pháp tuyệt vời nếu bạn nổi tiếng với WildFly và JBOSS, bạn có thể xem qua câu hỏi stackoverflow.com/questions/59006162/ trên đó
ZINE Mahmoud
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.