2016-07-12 5 views
0

Я пытаюсь выполнить проверку подлинности на токенах, используя Spring Security Plugin (2.0.0) и Spring Spring Authentication Rest Plugin (1.5.3) в структуре Grails (2.5 +0,0). Я устанавливаю поле заголовка «x-auth-token» на токен и отправляю URL-адрес целевого контроллера. Тем не менее, IDE (IntelliJ IDEA) выскочит сообщение об ошибкеGrails, Spring Security Rest Plugin, не могу вызвать метод loadUserByToken() для нулевого объекта

| Error 2016-07-12 15:58:27,864 [http-bio-8080-exec-10] ERROR [/hello_world]. 
[default] - Servlet.service() for servlet [default] in context with path [/hello_world] threw exception 
Message: Cannot invoke method loadUserByToken() on null object 
Line | Method 
->> 55 | authenticate in grails.plugin.springsecurity.rest.RestAuthenticationProvider 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  75 | doFilter  in grails.plugin.springsecurity.rest.RestTokenValidationFilter 
|  53 | doFilter . . in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter 
| 143 | doFilter  in grails.plugin.springsecurity.rest.RestAuthenticationFilter 
|  62 | doFilter . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter 
|  80 | doFilter  in grails.plugin.springsecurity.rest.RestLogoutFilter 
|  59 | doFilter . . in grails.plugin.springsecurity.web.SecurityRequestHolderFilter 
|  82 | doFilter  in com.brandseye.cors.CorsFilter 
| 1142 | runWorker . in java.util.concurrent.ThreadPoolExecutor 
| 617 | run   in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 745 | run . . . . in java.lang.Thread 

Я проверил этот метод loadUserByToken() и вызывается tokenStorageService. Я не знаю, почему этот токенStorageService является нулевым объектом. Spring Security и Spring Security Plugin настроены следующим образом:

Config.groovy

// Added by the Spring Security Core plugin: 
grails.plugin.springsecurity.userLookup.userDomainClassName = 'hello_world.User' 
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'hello_world.UserRole' 
grails.plugin.springsecurity.authority.className = 'hello_world.Role' 
grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
    '/':    ['permitAll'], 
    '/index':   ['permitAll'], 
    '/index.gsp':  ['permitAll'], 
    '/assets/**':  ['permitAll'], 
    '/**/js/**':  ['permitAll'], 
    '/**/css/**':  ['permitAll'], 
    '/**/images/**': ['permitAll'], 
    '/**/favicon.ico': ['permitAll'], 
    '/api/login':  ['permitAll'] 
] 

grails { 
    plugin { 
     springsecurity { 

      filterChain.chainMap = [ 
        '/api/guest/**': 'anonymousAuthenticationFilter,restTokenValidationFilter,restExceptionTranslationFilter,filterInvocationInterceptor', 
        '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter', // Stateless chain 
        '/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'                   // Traditional chain 
      ] 

      providerNames = ['restAuthenticationProvider','daoAuthenticationProvider', 'rememberMeAuthenticationProvider'] 

      auth.loginFormUrl = '/login/auth' 

      useSecurityEventListener = true 

      onAuthenticationSuccessEvent = { e, appCtx -> 
       // handle AuthenticationSuccessEvent 

       System.out.println("Authentication Succeeded"); 
      } 

      onAuthenticationSwitchUserEvent = { e, appCtx -> 
       // handle AuthenticationSwitchUserEvent 
      } 

      onAuthorizationEvent = { e, appCtx -> 
       // handle AuthorizationEvent 
      } 

      onRestTokenCreationEvent = { e, appCtx -> 

       System.out.println("Token Created") 
      } 

      apf { 
       filterProcessesUrl = '/api/login' 
       allowSessionCreation = false 
//    usernamePropertyName = 'username' 
//    passwordPropertyName = 'password' 
      } 

      rest { 

       active = true 

       login { 
        active = true 
        endpointUrl = '/api/login' 
        failureStatusCode = 401 
        useJsonCredentials = true 
        usernamePropertyName = 'username' 
        passwordPropertyName = 'password' 
       } 

       token { 

        validation { 
         active = true 
         endpointUrl = '/api/validate' 
         headerName = 'x-auth-token' 
         useBearerToken = false 
         tokenPropertyName = 'access_token' 
         enableAnonymousAccess = true 
        } 

        generation { 
         active = true 
         useSecureRandom = true 
         useUUID = false 
        } 

        rendering { 
         usernamePropertyName = 'username' 
         authoritiesPropertyName = 'roles' 
         tokenPropertyName = 'token' 
        } 

        storage { 
         active = true 
         useGorm = true 

         gorm { 
          tokenDomainClassName = 'hello_world.AuthenticationToken' 
          tokenValuePropertyName = 'tokenValue' 
          usernamePropertyName = 'username' 
         } 
        } 
       } 
      } 
     } 
    } 
} 

resources.groovy

import grails.plugin.springsecurity.rest.RestAuthenticationProvider 
beans = { 
    restAuthenticationProvider(RestAuthenticationProvider); 
} 

и я проверил базу данных, маркер хранится в authentication_token таблице. Я новичок в grails и искал часы и вообще не знаю. Может кто-нибудь мне помочь? очень признателен.

Если вам нужно что-нибудь еще, сообщите мне.

ответ

1

Для тех, у кого такая же проблема, после нескольких попыток, я, наконец, понял это. Кажется, что я не должен объявлять restAuthenticationProvider в resources.groovy и не должен добавлять restAuthenticationProvider в grails.plugin.springsecurity.providerNames в config.groovy. Полные конфиги для весенне-безопасности-ядра и весенне-безопасности-покоя перечислены ниже:

Config.groovy

grails { 
    plugin { 
     springsecurity { 

      useSecurityEventListener = true 

      filterChain { 
       chainMap = [ 
         '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter', // Stateless chain 
         '/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'                   // Traditional chain 
       ] 
      } //filterChain 

      apf { 
       filterProcessesUrl = '/api/login' 
      } //apf 

      rest { 

       login { 
        active = true 
        useRequestParamsCredentials = false 
        useJsonCredentials = true 
        usernamePropertyName = 'j_username' 
        passwordPropertyName = 'j_password' 
        endpointUrl = '/api/login' 
       } //login 

       logout { 

       } //logout 

       token { 

        validation { 
         active = true 
         endpointUrl = '/api/validate' 
         useBearerToken = false 
         headername = 'X-Auth-Token' 
        } //validation 

        generation { 
//      active = true 
//      useSecureRandom = true; 
//      useUUID = false; 
        } 

        rendering { 
         usernamePropertyName = 'username' 
         authoritiesPropertyName = 'roles' 
         tokenPropertyName = 'token' 
        } 

        storage { 
//      useJWT = true; 
        } //storage 
       } //token 
      } //rest 

      cors.headers = ['Access-Control-Allow-Headers': 'Content-Type, Authorization, X-Auth-Token'] 
     } //springsecurity 
    } //plugin 
} //grails 

вы должны отправить имя пользователя и пароль в формате JSON с полем «j_username» и " j_password ", и он вернет токен в формате json. Затем отправьте запрос вместе с этим токеном в поле заголовка «X-Auth-Token» на api, который вы хотите запросить.

Для инициализации пружинной безопасности основного плагина, пожалуйста, обратитесь к http://grails-plugins.github.io/grails-spring-security-core/v2/guide/single.html#tutorials

полные моему код доступен в GitHub: https://github.com/xixinhe/api_token_authentication

Перед запуском моего кода, пожалуйста, установите оракул MySQL 5.

Если есть что-то, что я написал, нарушая правила переполнения стека, сообщите мне, я изменюсь.

Я не являюсь носителем английского языка, пожалуйста, простите меня, дерьмовый английский.

Спасибо,