ওয়াইল্ড ফ্লাইয়ে স্প্রিং সিকিউরিটি: ফিল্টার চেইন কার্যকর করার সময় ত্রুটি


194

আমি স্প্রিং বুটের সাথে স্প্রিং সিকিউরিটি এসএএমএল এক্সটেনশনকে সংহত করার চেষ্টা করছি ।

বিষয়টি সম্পর্কে, আমি একটি সম্পূর্ণ নমুনা অ্যাপ্লিকেশন বিকাশ করেছি। এর উত্স কোডটি গিটহাবটিতে উপলভ্য:

এটিকে স্প্রিং বুট অ্যাপ্লিকেশন হিসাবে চালনা করে (এসডিকে অন্তর্নির্মিত অ্যাপ্লিকেশন সার্ভারের বিপরীতে চলছে), ওয়েব অ্যাপ ঠিকঠাক কাজ করে।

দুর্ভাগ্যক্রমে, একই আথন প্রক্রিয়া আন্ডারটও / ওয়াইল্ডফ্লাইতে মোটেও কাজ করে না ।

লগ অনুসারে, আইডিপি আসলে আউথএন প্রক্রিয়া সম্পাদন করে : আমার কাস্টম 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 বিভক্ত এবং হুল বিড়াল , সবকিছু সম্পূর্ণভাবে কাজ করে জরিমানা। এই সমস্যাটি সমাধান করার বিষয়ে আপনার কি কোনও ধারণা আছে?


2
বেশিরভাগ পরিস্থিতিতে, SecurityContextHolderএকটি অনুরোধের পরে সাফ করা উচিত। সেই কোডের একমাত্র উদ্দেশ্য যদি একই অনুরোধ চলাকালীন একবারে একাধিকবার ফিল্টার চেইন প্রয়োগ করা হয় (তবে এক্ষেত্রে কেবলমাত্র মূল চেইনই প্রসঙ্গটি সাফ করবে)। সুতরাং আমি মনে করি না যে এটি একটি সমস্যা।
ভেড়া শন করুন

2
বিটিডাব্লু, এই আচরণটি প্রতিবার লগইন প্রক্রিয়াটিকে আমন্ত্রণ জানায়। উদাহরণস্বরূপ এএস এর আমার সফ্টওয়্যারটি যথাযথভাবে কনফিগার করে কি এটি ঠিক করার কোনও উপায় আছে?
vdenotaris

1
আপনি এর অর্থ কী তা নিশ্চিত নন। কী আচরণ, এবং এটি কীভাবে লগইনকে অকার্যকর করে? কোনও থ্রেড একটি অনুরোধ পরিচালনার কাজ শেষ করার পরে প্রসঙ্গ সাফ করা স্বাভাবিক আচরণ - থ্রেড-লোকাল ডেটা থ্রেড পুলে ফিরিয়ে আটকানো জরুরি। সেই সময়ে সাধারণত ব্যবহারকারীদের সেশনে প্রসঙ্গটি ক্যাশে করা উচিত। সুতরাং এটি কোনও লগইনকে অকার্যকর করা উচিত নয়।
শন ভেড়া

2
উপরে বর্ণিত হিসাবে, এসএসওর পরে, অ্যাপ্লিকেশন সার্ভার সেশন ডেটা এবং প্রমাণীকরণের ডেটা সাফ করে। এটি শুধুমাত্র ওয়াইল্ডফ্লাইয়ের সাথে ঘটে: টমক্যাটের সাথে একই কোডটি সূক্ষ্মভাবে কাজ করে।
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 এবং JBOSS সঙ্গে বিখ্যাত আপনি যে প্রশ্নে দেখে নিতে পারেন stackoverflow.com/questions/59006162/...
zine মাহমুদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.