2017-02-18 12 views
0

Spring Security OAuth2に問題があります。キオスクシステムには、起動中にすべてのキオスクが中央のOAuth2プロバイダで認証する必要があるキオスクシステムがあります。資格情報には2つの店舗があります.1つは実際のユーザー(例:技術者)用でもう1つはキオスク用です。キオスクのコレクションには、キオスクプロファイル情報が格納されています。これは、キオスクで使用されているすべてのデバイス(請求書受領者、現金自動預け払い機、サーマルプリンタなど)のシリアル番号です。Spring OAuth2カスタム・グラント・タイプがクラスをオートワイヤするとnullが返される

ここでは、達成しようとしているフローを示します。

  • キオスクは、プロファイルが存在する場合、のOAuth2トークンを与え、すべてがプロファイルが存在しない場合は、キオスクプロファイルがキオスクに追加され
  • 素晴らしいですgrant_type=kiosk
  • で/のOAuth /トークンにそのプロファイル情報を送ります状態が「オフ」で、OAuth2が401権限を与えない

ここでは、キオスク認可のための新しい認可タイプを作成しました。しかし、SpringサービスであるKiosk Profile Data Mapperにアクセスする方法が必要です。だから、私のクラスでは、私は次の行を追加します。

class KioskTokenGranter extends AbstractTokenGranter { 
    @Autowire 
    KioskProfileService kioskProfile; 

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

上記snipperは私にkioskProfileが存在しないことにNullPointerExceptionを与えます。 AuthorizationServerConfigurerAdapterで同じことを行うと、autowireが機能します。だから、私の質問はどのようにTokenGranter内のサービスをAutowireすることです。

答えて

1

インスタンス化しているオブジェクトがSpringによって制御されていない普通の問題に直面しているようです。あなたはあなたのクラスに@Componentなどのような注釈をつけていません(私はあなたがこの場合にお勧めするものではありません)。 Springは@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; 
    } 

    ... 
} 

@RestControllerであり、それは使用することができるように、それにautowired UserDetailServiceを持っているUserDetailsService udsは、コンストラクタを介して渡されたの代わりにautowiredされていること。あなたはOBOTokenGenerator.javaOBOTokenGranterのusagedを見ることができます、グラニターの建設中。

@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); 

... 
} 

だから、残りの質問は:あなたのコードは、使用のこのパターンに従っていますか? KioskTokenGranterを構成するコントローラ/サービス/コンポーネント/などがありますか?

1

KioskTokenGranterには、@Componentと注釈を付ける必要があります。また、KioskTokenGranterが入っているパッケージでコンポーネントスキャンが有効になっていることを確認してください。

関連する問題