2017-02-18 30 views
0

У меня проблема с Spring Security OAuth2. Существует система киосков, где все киоски должны авторизоваться с центральным поставщиком OAuth2 во время запуска. Существует два магазина для учетных данных: один для фактических пользователей (например, техников) и другой для киосков. Коллекция для киосков хранит информацию о профиле киоска, которая по сути является серийным номером всех устройств, используемых в киоске (счет-акцептор, банкомат, термопринтер и т. Д.).Spring OAuth2 пользовательский тип гранта autowiring класс возвращает null

Итак, вот поток, которого я пытаюсь достичь.

  • киоска отправляет информацию о профиле в/OAuth/лексемы с grant_type=kiosk
  • Если профиль существует, OAuth2 дает фишку и все отлично
  • Если профиль не существует, профиль киоска добавляется в киосках сбор с состоянием «off» и OAuth2 дает 401 Несанкционированный

Теперь я создал новый тип гранта для авторизации киоска. Но мне нужен способ получить доступ к моему картографическому профилю профиля киоска, который является сервисом Spring. Так, в моем классе я добавляю следующее:

class KioskTokenGranter extends AbstractTokenGranter { 
    @Autowire 
    KioskProfileService kioskProfile; 

    protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) { 
      // request parsing stuff 
      kioskProfile.findByAttributes(...); 
    } 
} 

Snipper выше дает мне NullPointerException, что kioskProfile не существует. Если я делаю то же самое в AuthorizationServerConfigurerAdapter, работает autwire. Итак, мой вопрос заключается в том, как Autowire сервис внутри TokenGranter.

ответ

1

Похоже, вы просто столкнулись с простой проблемой, когда объекты, которые вы создаете, не контролируются весной. Вы не аннотировали свой класс как @Component или что-то в этом роде (не то, что я бы рекомендовал вам в этом случае). Весна не знает о вашей аннотации @Autowire.

Для другого примера реализации объекта AbstractTokenGranter, выполните OBOTokenGranter.java.

public class OBOTokenGranter extends AbstractTokenGranter { 

    ... 

    private UserDetailsService uds; 

    public OBOTokenGranter(UserDetailsService uds, AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService, 
     OAuth2RequestFactory requestFactory) { 
     super(tokenServices, clientDetailsService, requestFactory, GRANT_TYPE); 

     this.uds = uds; 
    } 

    ... 
} 

Обратите внимание, что UserDetailsService uds в настоящее время передается в через конструктор вместо autowired. Вы можете увидеть usaged из OBOTokenGranter в OBOTokenGenerator.java, который является @RestController и имеет UserDetailService autowired в него, так что он может быть использован в строительстве Грантера.

@RestController 
public class OBOTokenGenerator { 

... 

    @Autowired 
    private UserDetailsService uds; 

... 
    @RequestMapping("/obo/{user}") 
    public ResponseEntity<OAuth2AccessToken> getOBOToken(Principal principal, @PathVariable("user") String user) { 

... 

     OBOTokenGranter granter = new OBOTokenGranter(uds, tokenServices, clientDetailsService, requestFactory); 

... 
} 

Таким образом, остается вопрос: имеет ли ваш код этот образец использования? У вас есть контроллер/Сервис/Компонент/etc, который создает KioskTokenGranter?

1

KioskTokenGranter Аннотируется @Component. Кроме того, убедитесь, что для пакета включено сканирование компонентов, которое находится в KioskTokenGranter.