5

Springを使用して自分のWebサイトに「rememberme」機能を実装しようとしています。cookieとpersistent_loginsテーブルのエントリが正しく作成されています。さらに、ページの上部にユーザー名が表示されているため、正しいユーザーが復元されていることがわかります。

ただし、このユーザーが「記憶」された後に戻ってきたときにこのユーザーの情報にアクセスしようとすると、NullPointerExceptionが発生します。ユーザーがセッションに再度設定されていないように見えます。

私のapplicationContext-security.xmlには次のものが含まれています。

<remember-me data-source-ref="dataSource" user-service-ref="userService"/>

...

<authentication-provider user-service-ref="userService" />

<jdbc-user-service id="userService" data-source-ref="dataSource" 
role-prefix="ROLE_"
users-by-username-query="select email as username, password, 1 as ENABLED from user where email=?" 
authorities-by-username-query="select user.id as id, upper(role.name) as authority from user, role, users_roles where users_roles.user_fk=id and users_roles.role_fk=role.name and user.email=?"/>

ユーザーごとのクエリと関係があるのではないかと思いましたが、このクエリが正しくないとログインが正しく機能しませんでしたか?

これに関する助けをいただければ幸いです。

ありがとう、ギアロイド。

4

1 に答える 1

5

例外のスタック トレース全体を含めていただけますか? 上記で指定したremember-me構成にキー属性を設定していないため、SecurityContextHolderにトークンが設定されていないと思われます。

Remember Me がどのように機能するかの詳細を確認するには、RememberMeAuthenticationFilter のソースを参照する必要があります。そのソースはここで(直接)見つけることができます:

http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.security/spring-security-web/3.0.2.RELEASE/org/springframework/security/web/authentication/rememberme/RememberMeAuthenticationFilter.ジャワ

次の結果として、RememberMeAuthenticationFilter は RememberMeAuthenticationProvider を呼び出します。

rememberMeAuth = authenticationManager.authenticate(rememberMeAuth);

認証メソッド内で、キーを指定しないと例外がスローされることがわかります。

 if (this.key.hashCode() != ((RememberMeAuthenticationToken) authentication).getKeyHash()) {
            throw new BadCredentialsException(messages.getMessage("RememberMeAuthenticationProvider.incorrectKey",
                    "The presented RememberMeAuthenticationToken does not contain the expected key"));
        }

キーは、文字列 "your-company-name-{GUID}" などの文字列にすることができます。したがって、remember-me は次のようになります。

<remember-me key="your-company-name-rmkey-aWeFFTgxcv9u1XlkswUUiPolizxcwsqUmml" token-validity-seconds="3600" data-source-ref="dataSource"/>

トークンの有効性を設定することは、あなたがすべき本当に良い考えです。

許す

于 2010-11-15T19:41:49.700 に答える