2016-04-05 13 views
1

私のアプリケーションは、J2eePreauth認証プロバイダを使用しており、ここでMyUserとオブジェクトを取得するための一般的なコードです:getPrincipal()がUserオブジェクトを返し、UserDetailオブジェクトを返すときは?

MyUser user = (MyUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

最近、私はアップグレード春のセキュリティやSTHは今、それは私に

org.springframework.security.core.userdetails.User cannot be cast to com.myapp.domain.MyUser 
を与えるかもしれまで、それはすべての時間を動作します

そしてMyUserのクラスはちょうどインタフェースにUserDetails

を実装するには、鋳造のすべての時間を動作することを非常に奇妙ですが、最新のUPDAに関するさそれは崩壊する。

SecurityContextHolder.getContext().getAuthentication().getPrincipal()リターンUserDetailオブジェクトとそれがorg.springframework.security.core.userdetails.User

+0

おそらく、関数を定義しますあなたが使用しているSpringのバージョンの? Spring Securityをどのバージョンからアップグレードしましたか?メジャーバージョンとマイナーリリースバージョン(つまり、非パッチ)はAPIを変更できます。 Springでは、メジャーリリースのアップグレードのためにオンラインで移行ガイドを入手する必要があります。 –

+2

私はあなたが正しいquesitonを求めているとは思わない。 org.springframework.security.core.userdetails.UserクラスはUserDetailsを実装しています。 プリンシパルは、常にオブジェクトを返したUserDetailsS​​erviceの結果です。あなたのUserDetailsS​​erviceはどのように見えますか? –

+0

spring-boot-starter-parent 1.3.6から1.4.4に移行した後、同じ問題が発生しています。 Springのセキュリティは、Mavenの依存関係階層に従って4.1.4です。 –

答えて

1

を返さないそれは、常に1つのタイプに戻っていたときに私の質問です:オブジェクト

Object object = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

と戻りオブジェクトがorg.springframework.security.core.userdetails.Userのタイプです。あなたは春のセキュリティの定義済みのユーザークラスを使用する場合、あなたは、ユーザータイプにキャストすることができます

org.springframework.security.core.userdetails.User user = (User)object; 

をカスタム・ユーザー・クラスを定義する場合は、その後、これに別のアプローチがあります:

UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

これは、 Spring Securityの組み込みのUserクラスがUserDetailsクラスを実装しているため、100%の時間で動作します。 (あなたがより深く理解するために春のソースコードを読むことができます) その後で、あなたのアクティブなユーザーオブジェクトを見つける://あなたのIdフィールドがLongであると仮定すると 、UserRepository interface

interface UserRepository extends JpaRepository<domain.User,Long> { 
    domain.User findOneByUsername(String username); 
} 

その後、

@Autowired 
UserRepository userRepository; 
myCustomApp.domain.User = userRepository.findOneByUsername(userDetails.getUsername()); 
関連する問題