Wildfly पर स्प्रिंग सुरक्षा: फ़िल्टर श्रृंखला को निष्पादित करते समय त्रुटि


194

मैं स्प्रिंग बूट के साथ स्प्रिंग सिक्योरिटी एसएएमएल एक्सटेंशन को एकीकृत करने की कोशिश कर रहा हूं ।

मामले के बारे में, मैंने एक पूर्ण नमूना अनुप्रयोग विकसित किया। इसका सोर्स कोड GitHub पर उपलब्ध है:

इसे स्प्रिंग बूट एप्लिकेशन के रूप में चलाकर (SDK बिल्ट-इन एप्लिकेशन सर्वर के खिलाफ चल रहा है), WebApp ठीक काम करता है।

दुर्भाग्य से, एक ही AuthN प्रक्रिया अंडरट्रॉ / वाइल्डली पर बिल्कुल भी काम नहीं करती है ।

लॉग के अनुसार, IdP वास्तव में AuthN प्रक्रिया करता है: मेरे कस्टम UserDetailsकार्यान्वयन के निर्देशों को सही ढंग से निष्पादित किया जाता है। निष्पादन प्रवाह के बावजूद, स्प्रिंग सेट अप नहीं करता है और वर्तमान उपयोगकर्ता के लिए विशेषाधिकार जारी रखता है।

@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;
    }
}

डिबगिंग करते समय, मुझे पता चला कि समस्या FilterChainProxyक्लास पर निर्भर करती है । रनटाइम में, विशेषता FILTER_APPLIEDका ServletRequestएक शून्य मान होता है, इस प्रकार स्प्रिंग क्लियर हो जाता है 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);
    }
}

पर VMware vFabric टीसी Sever और बिलाव , सब कुछ पूरी तरह से ठीक काम करता है। क्या आपके पास इस मुद्दे को हल करने के बारे में कोई विचार है?


2
ज्यादातर स्थितियों में, SecurityContextHolderएक अनुरोध के बाद मंजूरी दे दी जानी चाहिए। उस कोड का एकमात्र उद्देश्य उस स्थिति में होता है जब फ़िल्टर श्रृंखला को एक ही अनुरोध के दौरान एक से अधिक बार लागू किया जाता है (जिस स्थिति में, केवल मूल श्रृंखला को संदर्भ साफ़ करना चाहिए)। इसलिए मुझे नहीं लगता कि यह कोई मुद्दा है।
भेड़

2
BTW, यह व्यवहार हर बार लॉगिन प्रक्रिया को इनवैलिड करता है। क्या इसे ठीक करने का एक तरीका है, उदाहरण के लिए एएस के मेरे सॉफ़्टवेयर को ठीक से कॉन्फ़िगर करके?
vdenotaris

1
आश्वस्त नहीं कि इससे आपका क्या अर्थ है। क्या व्यवहार, और यह लॉगिन को कैसे अमान्य करता है? एक थ्रेड खत्म होने पर संदर्भ को क्लियर करना सामान्य व्यवहार है - थ्रेड-लोकल डेटा को थ्रेड पूल में वापस जाने से रोकना आवश्यक है। उस बिंदु पर संदर्भ को आमतौर पर उपयोगकर्ता के सत्र में कैश किया जाना चाहिए। तो यह एक लॉगिन को अमान्य नहीं करना चाहिए।
भेड़

2
जैसा कि ऊपर वर्णित किया गया है, एसएसओ के बाद, एप्लिकेशन सर्वर सत्र डेटा और डेटा को साफ़ करता है। यह केवल Wildfly के साथ होता है: समान कोड Tomcat के साथ ठीक काम करता है।
vdenotaris

11
SecurityContextHolder.clearContext()स्पष्ट सत्र डेटा नहीं है। यह ThreadLocalथ्रेड को थ्रेड पूल में वापस करने से पहले संदर्भ के भंडारण को हटा देता है । मेरा कहना यह है कि यह हमेशा एक अनुरोध के अंत में होना चाहिए, इसलिए जो आप देख रहे हैं वह सामान्य है और आपकी समस्या का कारण नहीं है।
भेड़

जवाबों:


7

इस समस्या की पड़ताल करते हुए मैंने देखा है कि ऑर्टिकल रिक्वेस्ट में कुकीज़ और रेफ़र के साथ कुछ गड़बड़ है।

यदि आप वेब संदर्भ को रूट संदर्भ में बदलते हैं तो वर्तमान में वाइल्डफ़्लाई प्रमाणीकरण काम करेगा:

 <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>

Wildfly को पुनः आरंभ करने और कुकीज़ साफ़ करने के बाद, सभी को उम्मीद के मुताबिक काम करना चाहिए


अच्छा समाधान अगर आप WildFly और JBoss के साथ प्रसिद्ध हैं इस प्रश्न पर एक बार देख ले सकते हैं stackoverflow.com/questions/59006162/...
ZINE महमूद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.