मैं स्प्रिंग बूट के साथ स्प्रिंग सिक्योरिटी एसएएमएल एक्सटेंशन को एकीकृत करने की कोशिश कर रहा हूं ।
मामले के बारे में, मैंने एक पूर्ण नमूना अनुप्रयोग विकसित किया। इसका सोर्स कोड 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 और बिलाव , सब कुछ पूरी तरह से ठीक काम करता है। क्या आपके पास इस मुद्दे को हल करने के बारे में कोई विचार है?
SecurityContextHolder.clearContext()
स्पष्ट सत्र डेटा नहीं है। यह ThreadLocal
थ्रेड को थ्रेड पूल में वापस करने से पहले संदर्भ के भंडारण को हटा देता है । मेरा कहना यह है कि यह हमेशा एक अनुरोध के अंत में होना चाहिए, इसलिए जो आप देख रहे हैं वह सामान्य है और आपकी समस्या का कारण नहीं है।
SecurityContextHolder
एक अनुरोध के बाद मंजूरी दे दी जानी चाहिए। उस कोड का एकमात्र उद्देश्य उस स्थिति में होता है जब फ़िल्टर श्रृंखला को एक ही अनुरोध के दौरान एक से अधिक बार लागू किया जाता है (जिस स्थिति में, केवल मूल श्रृंखला को संदर्भ साफ़ करना चाहिए)। इसलिए मुझे नहीं लगता कि यह कोई मुद्दा है।