2013-01-02 5 views
12

मेरे पास प्रमाणीकरण के लिए शिरो का उपयोग करके एक वेबपैप है। web.xml के प्रासंगिक भागों और shiro.ini हैं:यदि उपयोगकर्ता पहले ही प्रमाणीकृत है तो मैं कॉन्फ़िगर किए गए Shiro loginUrl पर अनुरोध कैसे रीडायरेक्ट कर सकता हूं?

<listener> 
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 

<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>ShiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

और

[main] 
authc.loginUrl = /authoring/login.html 
authc.successUrl = /authoring 
logout.redirectUrl = /authoring/login.html 

[users] 
foo = foo 

[urls] 
/authoring/logout = logout 
/authoring/** = authc 

Shiro सही ढंग से गैर-प्रमाणीकृत ग्राहकों से सभी अनुरोधों को बीच में रोक और (कॉन्फ़िगर loginUrl पर रीडायरेक्ट और फिर उन्हें अग्रेषित करता है सफल प्रमाणीकरण के बाद अनुरोधित पृष्ठ पर)। मैं क्या करना चाहता हूं, यदि कोई प्रमाणीकृत क्लाइंट /authoring/login.html को स्पष्ट अनुरोध करता है, तो इसे रीडायरेक्ट करने/संलेखन करने के लिए। यह तभी होगा जब क्लाइंट प्रमाणीकृत हो।

उदाहरण के लिए, जीमेल कैसे काम करता है - मेल.google.com (या यहां तक ​​कि https://accounts.google.com/ServiceLogin) तक पहुंचने का प्रयास करते समय सोचें कि जब आप पहले ही लॉग इन कर चुके हैं तो आपको इनबॉक्स में रीडायरेक्ट कर दिया जाएगा। क्या शिरो के साथ बॉक्स के बाहर यह संभव है? यदि नहीं, तो इसे लागू करने का सही तरीका क्या है?

उत्तर

1

आप लॉगिन संभाल सकता का अनुरोध खुद को या अपने ढांचे का उपयोग कर, आप अब आप की जांच कर सकता है, तो उपयोगकर्ता के प्रवेश और अगर सही है अनुप्रेषित एक PassThruAuthenticationFilter

authc = org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter 

उपयोग करने के लिए अपने shiro.ini बदलने के लिए की आवश्यकता होगी:

Subject currentUser = SecurityUtils.getSubject(); 
if(currentUser.isAuthenticated()){ 
    //redirect 
}else{ 
    AuthenticationToken token = new UsernamePasswordToken(username, password); 
    currentUser.login(token); 
    WebUtils.redirectToSavedRequest(request, response, "index.xhtml"); 
} 

यह बॉक्स समाधान से पूरी तरह से बाहर नहीं है। मुझे यकीन नहीं है कि क्या आप प्रमाणीकरण के बाहर सफलता यूआरएल प्राप्त कर सकते हैं, आप मैन्युअल रूप से WebUtils.issueRedirect(req, resp, url)

+0

क्या आप PassThruAuthenticationFilter को विस्तारित करने और फिर उस कोड को ओवरराइड विधि में डालने का सुझाव दे रहे हैं? यदि ऐसा तरीका है - मुझे उपयुक्त एक प्रतीत नहीं होता है। या आप कह रहे हैं कि कोड नियंत्रक में होना चाहिए? वर्तमान में हमारे पास लॉगिन नियंत्रक नहीं है, और मैं यह समझने की कोशिश कर रहा हूं कि आपकी सिफारिश का उपयोग कैसे करें। – alan

+0

नहीं, मैं सुझाव दे रहा हूं कि आप उस कोड को अपने लॉगिन पेज पर जो भी सेवा देते हैं उसे डाल दें। मैं जेएसएफ का उपयोग करता हूं ताकि कोड मेरे बैकिंग बीन –

+0

में मेरे लॉगिन विधि के अंदर जा सके, आप जो भी चाहते हैं उसे करने के लिए आप डिफ़ॉल्ट फ़िल्टर 'org.apache.shiro.web.filter.authc.FormAuthenticationFilter' का विस्तार कर सकते हैं, तो आपको शायद पहुंच होगी यहां से सफलता यूआरएल भी –

1

मुझे एक ही समस्या का सामना करना पड़ा और लॉगिन पृष्ठ को जेएसपी में बदलकर और शुरुआत में पुनर्निर्देशन जोड़कर इसके आसपास काम किया:

<% 
    if (SecurityUtils.getSubject().isAuthenticated()) { 
     response.sendRedirect(request.getContextPath()); 
    } 
%> 
संबंधित मुद्दे

 संबंधित मुद्दे