আমি স্প্রিং বুটের সাথে স্প্রিং সিকিউরিটি এসএএমএল এক্সটেনশনকে সংহত করার চেষ্টা করছি ।
বিষয়টি সম্পর্কে, আমি একটি সম্পূর্ণ নমুনা অ্যাপ্লিকেশন বিকাশ করেছি। এর উত্স কোডটি গিটহাবটিতে উপলভ্য:
এটিকে স্প্রিং বুট অ্যাপ্লিকেশন হিসাবে চালনা করে (এসডিকে অন্তর্নির্মিত অ্যাপ্লিকেশন সার্ভারের বিপরীতে চলছে), ওয়েব অ্যাপ ঠিকঠাক কাজ করে।
দুর্ভাগ্যক্রমে, একই আথন প্রক্রিয়া আন্ডারটও / ওয়াইল্ডফ্লাইতে মোটেও কাজ করে না ।
লগ অনুসারে, আইডিপি আসলে আউথএন প্রক্রিয়া সম্পাদন করে : আমার কাস্টম 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 TC বিভক্ত এবং হুল বিড়াল , সবকিছু সম্পূর্ণভাবে কাজ করে জরিমানা। এই সমস্যাটি সমাধান করার বিষয়ে আপনার কি কোনও ধারণা আছে?
SecurityContextHolder.clearContext()
সেশন ডেটা সাফ করে না। এটি ThreadLocal
থ্রেড পুলে কোনও থ্রেড ছেড়ে দেওয়ার আগে প্রসঙ্গের সঞ্চয়স্থান সরিয়ে দেয় । আমার বক্তব্যটি হ'ল একটি অনুরোধের শেষে এটি সর্বদা হওয়া উচিত, সুতরাং আপনি যা দেখছেন তা স্বাভাবিক এবং আপনার সমস্যার কারণ হতে পারে না।
SecurityContextHolder
একটি অনুরোধের পরে সাফ করা উচিত। সেই কোডের একমাত্র উদ্দেশ্য যদি একই অনুরোধ চলাকালীন একবারে একাধিকবার ফিল্টার চেইন প্রয়োগ করা হয় (তবে এক্ষেত্রে কেবলমাত্র মূল চেইনই প্রসঙ্গটি সাফ করবে)। সুতরাং আমি মনে করি না যে এটি একটি সমস্যা।