1

プロジェクトにカスタムの「認証プロバイダ」を実装する必要がありましたが、JSP で認証のオブジェクト プロパティにアクセスしようとしたときに問題が発生しました。詳細: カスタム認証プロバイダーが Authentication オブジェクトを正常に作成しました

Authentication auth = new UsernamePasswordAuthenticationToken(username, password, getAuthorities(userRoles));
log.info("User is authenticated");
return auth;

(ここでは関連するコードのみ)

次に、コントローラー メソッドで、ユーザー名を含むログ メッセージを表示します (これは、Authentication オブジェクトが作成され、セキュリティ コンテキストに配置されたことを証明します)。

Authentication auth = SecurityContextHolder.getContext().getAuthentication();        
log.info("Welcoming user " + auth.getPrincipal());

次に、JSPページで、次を使用してユーザー名を表示したい

<sec:authentication property="principal"/>

ただし、これによりエラー 500 が発生します。

org.springframework.beans.NotReadablePropertyException: Invalid property 'principal' of bean class [org.springframework.security.authentication.UsernamePasswordAuthenticationToken]: Bean property 'principal' is not readable...

ということにも気づきました

<sec:authorize ifAnyGranted="role">...

ユーザーは認証オブジェクトに追加された必要な役割を持っていますが、機能していません。

私が間違っていることはありますか?認証は正常に機能しますが、認証オブジェクトのプロパティにアクセスできません。

どうぞよろしくお願いいたします。

4

3 に答える 3

2

AuthenticationProvider は UserDetails オブジェクトを返す必要があります。

春のドキュメントからこのタグは、セキュリティコンテキストに保存されている現在の認証オブジェクトへのアクセスを許可します。オブジェクトのプロパティを JSP で直接レンダリングします。したがって、たとえば、Authentication のプリンシパル プロパティが Spring Security の UserDetails オブジェクトのインスタンスである場合、使用すると現在のユーザーの名前がレンダリングされます。

于 2012-09-21T20:58:24.997 に答える
1

あなたのケースに問題が見当たらないことを考えると、Spring 3.1.1 で修正されたSPR-8347バグである可能性があると思います。アップグレードはできますか?

于 2012-09-21T13:13:01.010 に答える