दिलचस्प पोस्ट
कैसे जावास्क्रिप्ट सरणी यादृच्छिक (फेरबदल) करने के लिए? कर्ल आदेश के लिए डेटा urlencode कैसे करें? कमांड प्रॉम्प्ट में सी # स्रोत फ़ाइल को संकलित करना / निष्पादित करना SQL सर्वर में डुप्लिकेट पंक्तियों को कैसे हटाएं? ASP.NET MVC का उपयोग करते हुए एकाधिक पैरामीटर के साथ रूटिंग जावा: JPanel पृष्ठभूमि छवि के पहलू अनुपात को बनाए रखने MFMailComposeViewController में फ़ील्ड को लॉक करना टंकिनर अजगर 3 में विभिन्न वर्गों से चर तक कैसे पहुंचें स्विंग जीयूआई कक्षाओं और श्रोताओं के साथ जेफाइलक्लोसर का उपयोग करना पीजी-वादे के साथ मल्टी-पंक्ति डालें वसंत डेटा जेपीए में कस्टम विधि कैसे जोड़ें ट्यूपल्स की सूची को 2 आइटम से पूर्ण करें (पूर्णांक मान) कक्षा के लिए सीएसएस 3 एनटी प्रकार प्रतिबंधित किसी संख्या के विभाजन उत्पन्न करना $ (विंडो) के बीच का अंतर। लोड () और $ (दस्तावेज़) .ready () फ़ंक्शन

स्प्रिंग सिक्योरिटी 3.एक्स को एक से अधिक एंट्री पॉइंट्स को कॉन्फ़िगर करना

मैं अपनी परियोजनाओं के लिए उपयोगकर्ता प्रमाणीकरण को संभालने के लिए स्प्रिंग सिक्योरिटी 3.x का प्रयोग कर रहा हूं, और अब तक, यह फ्लोअलेस से काम करता है।

मैंने हाल ही में एक नई परियोजना के लिए आवश्यकताओं को प्राप्त किया है इस परियोजना में, उपयोगकर्ता के प्रमाणीकरण के 2 सेटों की आवश्यकता होती है: एक एलडीएपी के खिलाफ कर्मचारियों को प्रमाणित करने के लिए, और दूसरा डेटाबेस के विरुद्ध ग्राहक को प्रमाणित करने के लिए। मैं एक छोटे से स्टम्प्ड हूं कि कैसे कॉन्फ़िगर करने के लिए कि स्प्रिंग सुरक्षा में

मेरा आरंभिक विचार एक लॉगिन स्क्रीन बनाने के लिए था, जिसमें निम्न फ़ील्ड हैं: –

  • रेडियो बटन फ़ील्ड – उपयोगकर्ताओं को यह चुनने के लिए कि वे कर्मचारी हैं या ग्राहक हैं
  • j_username उपयोगकर्ता फ़ील्ड
  • j_password पासवर्ड फ़ील्ड

अगर उपयोगकर्ता "कर्मचारी" का चयन करता है, तो मुझे स्प्रिंग सिक्योरिटी को एलडीएपी के खिलाफ प्रमाणित करना है, अन्यथा क्रेडेंशियल को डेटाबेस के विरुद्ध प्रमाणित किया जाएगा। हालांकि, समस्या यह है कि फार्म /j_spring_security_check को सबमिट किया जाएगा और मेरे कार्यान्वयन किए गए कस्टम प्रमाणीकरण प्रदाता को रेडियो बटन फ़ील्ड भेजने के लिए कोई रास्ता नहीं है। मेरा प्रारंभिक विचार है कि मुझे डिफ़ॉल्ट /j_spring_security_check पर निर्भर होने के बजाय दो फ़ॉर्म सबमिशन यूआरएल की आवश्यकता है I प्रत्येक यूआरएल को अलग-अलग प्रमाणीकरण प्रदाताओं द्वारा संभाला जाएगा, लेकिन मुझे यकीन नहीं है कि स्प्रिंग सिक्योरिटी में कैसे कॉन्फ़िगर किया जाए।

मैं स्प्रिंग सुरक्षा में जानता हूं, मैं वापस वापस प्रमाणीकरण को कॉन्फ़िगर कर सकता हूं, उदाहरण के लिए यदि एलडीएपी प्रमाणीकरण विफल रहता है, तो यह डेटाबेस प्रमाणीकरण पर वापस आ जाएगा, लेकिन यह इस नई परियोजना के लिए मैं जो शूटिंग कर रहा हूं, वह नहीं है।

क्या कोई साझा करता है कि मैं इसे वसंत सुरक्षा 3.x में किस प्रकार कॉन्फ़िगर करना चाहिए?

धन्यवाद।


अद्यतन – 01-28-2011 – @ एजीएजेल की तकनीक

मैं निम्नलिखित करने की कोशिश कर रहा हूं: –

  • कर्मचारी का फॉर्म लॉगिन /j_spring_security_check_for_employee लिए जमा करता है
  • ग्राहक फॉर्म लॉगिन /j_spring_security_check_for_customer को सबमिट किया गया है

कारण मुझे 2 अलग-अलग फॉर्म लॉगिन चाहिए, मुझे उपयोगकर्ता के आधार पर प्रमाणीकरण को अलग-अलग संचालन के लिए अनुमति देने की अनुमति देना है, एक फ़ॉल-बैक प्रमाणीकरण करने के बजाय। यह संभव है कि मेरे मामले में कर्मचारी और ग्राहक का समान उपयोगकर्ता आईडी हो।

मैंने @ EasyAngel के विचार को शामिल किया, लेकिन कुछ बहिष्कृत वर्गों को बदलना होगा। मैं वर्तमान में समस्या का सामना करना पड़ रहा हूँ न तो फ़िल्टर प्रक्रियाएं यूआरएल स्प्रिंग सुरक्षा में पंजीकृत हैं क्योंकि मुझे Error 404: SRVE0190E: File not found: /j_spring_security_check_for_employee मेरा पेट लग रहा है springSecurityFilterChain बीन ठीक से नहीं springSecurityFilterChain है, इस प्रकार मेरे कस्टम फ़िल्टर बिल्कुल भी उपयोग नहीं किए जाते हैं।

वैसे, मैं com.ibm.ws.webcontainer.invokefilterscompatibility=true का उपयोग कर रहा हूं और मेरे पास com.ibm.ws.webcontainer.invokefilterscompatibility=true सर्वर में com.ibm.ws.webcontainer.invokefilterscompatibility=true संपत्ति सेट है com.ibm.ws.webcontainer.invokefilterscompatibility=true मैं समस्या के बिना डिफ़ॉल्ट /j_spring_security_check को हिट करने में सक्षम हूं

यहां मेरा पूरा सुरक्षा विन्यास है: –

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <sec:http auto-config="true"> <sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/welcome.jsp" always-use-default-target="true" /> <sec:logout logout-success-url="/login.jsp" /> <sec:intercept-url pattern="/employee/**" access="ROLE_EMPLOYEE" /> <sec:intercept-url pattern="/customer/**" access="ROLE_CUSTOMER" /> <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> </sec:http> <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> <sec:filter-chain-map path-type="ant"> <sec:filter-chain pattern="/**" filters="authenticationProcessingFilterForEmployee, authenticationProcessingFilterForCustomer" /> </sec:filter-chain-map> </bean> <bean id="authenticationProcessingFilterForEmployee" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> <property name="authenticationManager" ref="authenticationManagerForEmployee" /> <property name="filterProcessesUrl" value="/j_spring_security_check_for_employee" /> </bean> <bean id="authenticationProcessingFilterForCustomer" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> <property name="authenticationManager" ref="authenticationManagerForCustomer" /> <property name="filterProcessesUrl" value="/j_spring_security_check_for_customer" /> </bean> <bean id="authenticationManagerForEmployee" class="org.springframework.security.authentication.ProviderManager"> <property name="providers"> <list> <ref bean="employeeCustomAuthenticationProvider" /> </list> </property> </bean> <bean id="authenticationManagerForCustomer" class="org.springframework.security.authentication.ProviderManager"> <property name="providers"> <list> <ref bean="customerCustomAuthenticationProvider" /> </list> </property> </bean> <bean id="employeeCustomAuthenticationProvider" class="ss.EmployeeCustomAuthenticationProvider"> <property name="userDetailsService"> <bean class="ss.EmployeeUserDetailsService"/> </property> </bean> <bean id="customerCustomAuthenticationProvider" class="ss.CustomerCustomAuthenticationProvider"> <property name="userDetailsService"> <bean class="ss.CustomerUserDetailsService"/> </property> </bean> <sec:authentication-manager> <sec:authentication-provider ref="employeeCustomAuthenticationProvider" /> <sec:authentication-provider ref="customerCustomAuthenticationProvider" /> </sec:authentication-manager> </beans> 

मैं यहाँ एक इनाम शुरू कर रहा हूँ क्योंकि मुझे पहले से ही कई दिनों से यह काम मिल रहा है … हताशा शब्द है मैं उम्मीद कर रहा हूं कि कोई समस्या (या) को इंगित करेगा, या यदि आप मुझे (कोड में) इसे संभाल करने के लिए एक बेहतर या क्लीनर दिखा सकते हैं

मैं स्प्रिंग सुरक्षा 3.x का उपयोग कर रहा हूं।

धन्यवाद।


01-29-2011 अपडेट करें – @ रितेश की तकनीक

ठीक है, मुझे मिल गया @ रितेश के पास जो काम मैं चाहता था उससे बहुत करीबी काम करने के लिए। मेरे पास रेडियोबूटन है जो उपयोगकर्ता को यह चुनने की अनुमति देता है कि वे ग्राहक या कर्मचारी हैं या नहीं। ऐसा लगता है कि यह दृष्टिकोण काफी अच्छी तरह से काम कर रहा है, एक समस्या के साथ …

  • यदि कर्मचारी सही क्रेडेंशियल के साथ लॉग इन करता है, तो वे इन्हें अनुमति देते हैं … काम के रूप में अपेक्षित
  • यदि कर्मचारी गलत क्रेडेंशियल के साथ लॉग इन करता है, तो उन्हें इन्हें स्वीकार्य नहीं है … काम के रूप में अपेक्षित
  • अगर ग्राहक सही क्रेडेंशियल के साथ लॉग इन करता है, तो उन्हें इन्हें अनुमति दी जाती है … काम के रूप में अपेक्षित
  • अगर ग्राहक गलत पहचान के साथ लॉग इन करता है, तो प्रमाणीकरण कर्मचारी प्रमाणन पर वापस आता है … काम नहीं करता है यह जोखिम भरा है क्योंकि अगर मैं ग्राहक प्रमाणन का चयन करता हूं, और यह कर्मचारी क्रेडेंशियल को पंच बनाता है, तो यह उपयोगकर्ता को भी अनुमति देगा और यह वह नहीं है जो मुझे चाहिए।
  <sec:http auto-config="false" entry-point-ref="loginUrlAuthenticationEntryPoint"> <sec:logout logout-success-url="/login.jsp"/> <sec:intercept-url pattern="/employee/**" access="ROLE_EMPLOYEE"/> <sec:intercept-url pattern="/customer/**" access="ROLE_CUSTOMER"/> <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <sec:custom-filter position="FORM_LOGIN_FILTER" ref="myAuthenticationFilter"/> </sec:http> <bean id="myAuthenticationFilter" class="ss.MyAuthenticationFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationFailureHandler" ref="failureHandler"/> <property name="authenticationSuccessHandler" ref="successHandler"/> </bean> <bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> <property name="loginFormUrl" value="/login.jsp"/> </bean> <bean id="successHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"> <property name="defaultTargetUrl" value="/welcome.jsp"/> <property name="alwaysUseDefaultTargetUrl" value="true"/> </bean> <bean id="failureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> <property name="defaultFailureUrl" value="/login.jsp?login_error=1"/> </bean> <bean id="employeeCustomAuthenticationProvider" class="ss.EmployeeCustomAuthenticationProvider"> <property name="userDetailsService"> <bean class="ss.EmployeeUserDetailsService"/> </property> </bean> <bean id="customerCustomAuthenticationProvider" class="ss.CustomerCustomAuthenticationProvider"> <property name="userDetailsService"> <bean class="ss.CustomerUserDetailsService"/> </property> </bean> <sec:authentication-manager alias="authenticationManager"> <sec:authentication-provider ref="customerCustomAuthenticationProvider"/> <sec:authentication-provider ref="employeeCustomAuthenticationProvider"/> </sec:authentication-manager> </beans> 

यहां मेरा अपडेट किया गया कॉन्फ़िगरेशन है यह कुछ सचमुच छोटे tweak होना चाहिए मुझे रोकने के लिए प्रमाणीकरण को रोकने के लिए क्या करना है, लेकिन मुझे अब यह पता नहीं लग सकता है।

धन्यवाद।

अद्यतन – समाधान @ रितेश की तकनीक के लिए

ठीक है, मुझे लगता है कि मैंने यहां समस्या का हल किया है। CustomerUsernamePasswordAuthenticationToken लिए CustomerCustomAuthenticationProvider लिए, जैसा मैं EmployeeUsernamePasswordAuthenticationToken डिफ़ॉल्ट UsernamePasswordAuthenticationToken पासवर्ड पर निर्भर होने के बजाय एटिफिकेशन EmployeeCustomAuthenticationProvider लिए, मैंने इसके लिए EmployeeUsernamePasswordAuthenticationToken बनाया है ये प्रदाताओं तब supports() ओवरराइड करेंगे supports() : –

CustomerCustomAuthenticationProvider वर्ग

 @Override public boolean supports(Class<? extends Object> authentication) { return (CustomerUsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); } 

EmployeeCustomAuthenticationProvider वर्ग

 @Override public boolean supports(Class<? extends Object> authentication) { return (EmployeeUsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); } 

MyAuthenticationFilter वर्ग

 public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { ... UsernamePasswordAuthenticationToken authRequest = null; if ("customer".equals(request.getParameter("radioAuthenticationType"))) { authRequest = new CustomerUsernamePasswordAuthenticationToken(username, password); } else { authRequest = new EmployeeUsernamePasswordAuthenticationToken(username, password); } setDetails(request, authRequest); return super.getAuthenticationManager().authenticate(authRequest); } 

… और वालएए! निराशा के कई दिनों बाद यह पूरी तरह से काम करता है!

उम्मीद है, यह पद किसी ऐसे व्यक्ति की मदद करने में सक्षम होगा जो एक ही काम कर रहे हैं जैसा कि मैं यहां हूं।

वेब के समाधान से एकत्रित समाधान "स्प्रिंग सिक्योरिटी 3.एक्स को एक से अधिक एंट्री पॉइंट्स को कॉन्फ़िगर करना"

आपको /j_spring_security_check_for_employee और /j_security_check_for_customer filterProcessingUrl /j_spring_security_check_for_employee बनाने की आवश्यकता नहीं है।

डिफ़ॉल्ट एक रेडियो बटन क्षेत्र विचार के साथ ठीक काम करेगा

कस्टम लॉगिन LoginFilter , आपको कर्मचारी और ग्राहक के लिए अलग-अलग टोकन बनाना होगा।

ये कदम हैं:

  1. कर्मचारी लॉगिन के लिए डिफ़ॉल्ट UsernamePasswordAuthenticationToken पासवर्ड अकाउंटिंग UsernamePasswordAuthenticationToken उपयोग करें

  2. ग्राहक लॉगिन के लिए CustomerAuthenticationToken बनाएं एब्टट्रेट एटिफिकेशन AbstractAuthenticationToken बढ़ाएं ताकि इसकी क्लास टाइप यूजरनाम पासवर्ड से अलग हो।

  3. कस्टम लॉगिन फ़िल्टर परिभाषित करें:

     <security:http> <security:custom-filter position="FORM_LOGIN_FILTER" ref="customFormLoginFilter" /> </security:http> 
  4. customFormLoginFilter , ओवरराइड attemptAuthentication रूप में attemptAuthentication निम्न (छद्म कोड):

     if (radiobutton_param value employee) { UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); setDetails(whatever); return getAuthenticationManager().authenticate(authRequest); } else if (radiobutton_param value customer) { CustomerAuthenticationToken authRequest = new CustomerAuthenticationToken(username, password); setDetails(whatever); return getAuthenticationManager().authenticate(authRequest); } 
  5. UsernamePasswordAuthenticationToken पासवर्ड supports करने के लिए EmployeeCustomAuthenticationProvider में ओवरराइड विधि का supports

  6. CustomerCustomAuthenticationProvider का समर्थन करने के लिए CustomerAuthenticationToken में ओवरराइड विधि का supports

     @Override public boolean supports(Class<?> authentication) { return (CustomerAuthenticationToken.class.isAssignableFrom(authentication)); } 
  7. authentication-manager में दोनों प्रदाताओं का उपयोग करें:

     <security:authentication-manager alias="authenticationManager"> <security:authentication-provider ref='employeeCustomAuthenticationProvider ' /> <security:authentication-provider ref='customerCustomAuthenticationProvider ' /> </security:authentication-manager> 

आप कई AuthenticationProcessingFilter फ़िल्टर फ़िल्टर को परिभाषित कर सकते हैं। उनमें से प्रत्येक में अलग यूआरएल जैसे / j_security_check_for_employee और / j_security_check_for_customer हो सकते हैं । यहां इस आशय को प्रदर्शित करने वाले सुरक्षा एप्लिकेशन संदर्भ का उदाहरण दिया गया है:

 <bean id="myfilterChainProxy" class="org.springframework.security.util.FilterChainProxy"> <security:filter-chain-map pathType="ant"> <security:filter-chain pattern="/**" filters="authenticationProcessingFilterForCustomer, authenticationProcessingFilterForEmployee, ..." /> </security:filter-chain-map> </bean> <bean id="authenticationProcessingFilterForCustomer" class="org.springframework.security.web.authentication.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManagerForCustomer"/> <property name="filterProcessesUrl" value="/j_security_check_for_customer"/> </bean> <bean id="authenticationProcessingFilterForEmployee" class="org.springframework.security.web.authentication.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManagerForEmployee"/> <property name="filterProcessesUrl" value="/j_security_check_for_employee"/> </bean> <bean id="authenticationManagerForCustomer" class="org.springframework.security.authentication.ProviderManager"> <property name="providers"> <list> <bean class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService"> <ref bean="customerUserDetailsServiceThatUsesDB"/> </property> </bean> </list> </property> </bean> <bean id="authenticationManagerForEmployee" class="org.springframework.security.authentication.ProviderManager"> <property name="providers"> <list> <bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <property name="userDetailsService"> <ref bean="employeeUserDetailsServiceThatUsesLDAP"/> </property> </bean> </list> </property> </bean> 

जैसा कि आप देख सकते हैं, इस परिदृश्य में आपके पास अलग-अलग UserDetailService एस-एस – डीबी UserDetailService और एलडीएपी के लिए है।

मुझे लगता है कि ग्राहकों और कर्मचारी के लिए अलग-अलग प्रमाण पत्र यूआरएल होने का अच्छा विचार है (विशेषकर यदि वे अलग-अलग प्रमाणीकरण रणनीतियों का उपयोग करते हैं) आप उनके लिए अलग लॉगिन पेज भी कर सकते हैं।

आप डीबी में इस जानकारी को स्टोर कर सकते हैं। उदाहरण के लिए आप Users टेबल में ldap_auth नामक कॉलम हो सकते हैं। आप मेरे दूसरे उत्तर को देख सकते हैं (एक उदाहरण के रूप में):

स्प्रिंग लॉग इन फॉर्म उदाहरण

यदि आप सावधानी से UserService वर्ग देखते हैं, तो आप देखेंगे कि मैं वास्तव में इस एलडीएपी ध्वज का परीक्षण करता हूं और एलडीएपी या डेटाबेस से उपयोगकर्ता पासवर्ड लेता हूं।

यह मुझे फिर से है 🙂 क्या आप इस तरह फिल्टर का उपयोग करने की कोशिश कर सकते हैं:

 <sec:http auto-config="true"> ... <sec:custom-filter ref="authenticationProcessingFilterForCustomer" after="FIRST"/> <sec:custom-filter ref="authenticationProcessingFilterForEmployee" after="FIRST"/> </sec:http> 

बीन springSecurityFilterChain को परिभाषित करने के बजाय springSecurityFilterChain