2011-08-15 15 views
6

स्प्रिंग सुरक्षा का उपयोग करके मैं एक grails एप्लिकेशन को कैसे कॉन्फ़िगर कर सकता हूं जैसे कि यूआरएल का एक सेट अनधिकृत उपयोगकर्ताओं को 200 के HTTP प्रतिक्रिया कोड के साथ कस्टम लॉगिन फॉर्म पर रीडायरेक्ट करेगा, जबकि यूआरएल का एक और सेट आराम से वेब सेवाओं को कार्यान्वित कर रहा है और उसे 401/अनधिकृत ग्राहकों के लिए अधिकृत प्रतिक्रिया नहीं है, इसलिए ग्राहक आवेदन 401 के जवाब में उपयोगकर्ता नाम और पासवर्ड के साथ अनुरोध भेज सकता है।प्रति यूआरएल grails/वसंत प्रमाणीकरण योजना को कैसे कॉन्फ़िगर करें?

मेरा वर्तमान कॉन्फ़िगरेशन कस्टम लॉगिन फ़ॉर्म के साथ पहला मामला संभाल सकता है। हालांकि, मानव इंटरफ़ेस के लिए वर्तमान व्यवहार को संरक्षित करते समय, मुझे शेष इंटरफेस url के लिए अन्य प्रकार के प्रमाणीकरण को कॉन्फ़िगर करने की आवश्यकता है।

धन्यवाद!

उत्तर

0

मुझे एक ही समस्या थी और इसके लिए कोई अच्छा समाधान नहीं मिला। मैं वास्तव में एक स्वच्छ समाधान की तलाश कर रहा हूं (बहु-किरायेदार जैसे संदर्भ में कुछ)।

मैंने दूसरी प्रणाली के लिए मैन्युअल रूप से स्थिति और लॉगिन-भाग की पुष्टि की, जिसे लॉगिन पृष्ठ पर रीडायरेक्ट नहीं करना चाहिए (इसलिए मैं "सुरक्षित" एनोटेशन का उपयोग नहीं कर रहा हूं)। मैंने springSecurityService.reauthenticate() (मैन्युअल रूप से लॉग इन करने के लिए), springSecurityService.isLoggedIn() और दूसरे सिस्टम के लिए प्रत्येक नियंत्रक में मैन्युअल रूप से इसका उपयोग किया। अगर वह नहीं था, तो मैं विशिष्ट पृष्ठ पर रीडायरेक्ट कर रहा हूं।

मुझे नहीं पता, यह काम आपके आसपास के सिस्टम के लिए सस्ती है या नहीं।

7

यदि मुझे सही समझ में आया कि आप क्या करना चाहते हैं, तो मुझे पहले भी यही समस्या मिली! लेकिन Spring Security grails Plugin का उपयोग करके इसे हल करना आसान है!

grails.plugins.springsecurity.useBasicAuth = true 

तो अपने शोकहारा सेवाओं के लिए लॉग इन करने की कोशिश करेंगे, और अगर यह काम does not यह 401 को जाता है: तो, सब से पहले, आप बुनियादी प्रमाणीकरण का उपयोग करने के लिए अपने आवेदन स्थापित करने के लिए है! यह आसान है लेकिन आपको सही लॉगिन करने के लिए कस्टम फॉर्म का उपयोग करने की भी आवश्यकता है ?! तो आप बस कुछ यूआरएल विन्यास कर सकते हैं करने के लिए इस तरह अपने सामान्य लॉगिन रणनीति में हो जाता है:,

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter', 
    '/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter' 
] 

तो ध्यान से ऊपर है कि, सब कुछ है कि यूआरएल/एपीआई के लिए आता है/मूल प्रमाणीकरण का उपयोग करेगा, लेकिन कुछ भी है कि नहीं है से/api/सामान्य प्रमाणीकरण लॉगिन फॉर्म का उपयोग करता है!

संपादित

अधिक जानकारी चला जाता है http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

+0

इसके अलावा, सावधान रहना इस बग ने काट लिया करने के लिए नहीं ऐसा न हो कि आप बर्बाद घंटे यह पता लगाने की क्यों यह आपके लिए काम नहीं करता है की कोशिश कर रहा है: http://jira.grails.org/browse/GPSPRINGSECURITYCORE-210 – James

0

को आप राज्यविहीन बुनियादी प्रमाणीकरण करना चाहिए। इसके लिए कृपया अपने कोड में निम्नलिखित परिवर्तन करें।
UrlMappings.groovy

"/api/restLogin"(controller: 'api', action: 'restLogin', parseRequest: true) 

Config.groovy

grails.plugin.springsecurity.useBasicAuth = true 
grails.plugin.springsecurity.basic.realmName = "Login to My Site" 
    grails.plugin.springsecurity.filterChain.chainMap = [ 
       '*'   : 'statelessSecurityContextPersistenceFilter,logoutFilter,authenticationProcessingFilter,customBasicAuthenticationFilter,securityContextHolderAwareRequestFilter,rememberMeAuthenticationFilter,anonymousAuthenticationFilter,basicExceptionTranslationFilter,filterInvocationInterceptor', 
       '/api/': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter' 
     ] 

resources.groovy

statelessSecurityContextRepository(NullSecurityContextRepository) {} 

    statelessSecurityContextPersistenceFilter(SecurityContextPersistenceFilter, ref('statelessSecurityContextRepository')) { 
    } 
    customBasicAuthenticationEntryPoint(CustomBasicAuthenticationEntryPoint) { 
     realmName = SpringSecurityUtils.securityConfig.basic.realmName 
    } 

    customBasicAuthenticationFilter(BasicAuthenticationFilter, ref('authenticationManager'), ref('customBasicAuthenticationEntryPoint')) { 
     authenticationDetailsSource = ref('authenticationDetailsSource') 
     rememberMeServices = ref('rememberMeServices') 
     credentialsCharset = SpringSecurityUtils.securityConfig.basic.credentialsCharset // 'UTF-8' 
    } 

    basicAccessDeniedHandler(AccessDeniedHandlerImpl) 

    basicRequestCache(NullRequestCache) 

    basicExceptionTranslationFilter(ExceptionTranslationFilter, ref('customBasicAuthenticationEntryPoint'), ref('basicRequestCache')) { 
     accessDeniedHandler = ref('basicAccessDeniedHandler') 
     authenticationTrustResolver = ref('authenticationTrustResolver') 
     throwableAnalyzer = ref('throwableAnalyzer') 
    } 

CustomBasicAuthenticationEntryPoint।ग्रूवी

public class CustomBasicAuthenticationEntryPoint extends 
     BasicAuthenticationEntryPoint { 

    @Override 
    public void commence(HttpServletRequest request, 
         HttpServletResponse response, AuthenticationException authException) 
      throws IOException, ServletException {    
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } 

} 

ApiController

@Secured('permitAll') 
class ApiController { 
def springSecurityService 
@Secured("ROLE_USER") 
    def restLogin() {   
     User currentUser = springSecurityService.currentUser 
     println(currentUser.username) 
    } 
} 
संबंधित मुद्दे