4

春の秘密の質問です。

を使用してカスタム User オブジェクト オブジェクトを取得できるようにしたい

SecurityContextHolder.getContext().getAuthentication().getPrincipal();

クラスのさらなるビジネスロジックのために、ユーザーIDなどの追加の詳細が必要だからです。

このために、org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl から派生したカスタム クラスを用意し、loadUsersByUsername() をオーバーライドして追加のユーザー フィールドを設定し、ユーザー ID などの追加フィールドを含む MyUser のオブジェクトを返します。 .

コード -

public class MyJdbcDaoImpl extends JdbcDaoImpl {

@Override
protected List<UserDetails> loadUsersByUsername(String username) {
    return getJdbcTemplate().query(getUsersByUsernameQuery(), new String[] {username}, new RowMapper<UserDetails>() {
        public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException {
            Long id = rs.getLong(1);
            String username = rs.getString(2);
            String password = rs.getString(3);
            boolean enabled = rs.getBoolean(4);
            MyUser user = new MyUser(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES);
            user.setId(id);
            return user;
        }

    });
}
}

私のアプリケーションコンテキスト -

<beans:bean id="myJdbcDaoImpl" class="package.MyJdbcDaoImpl">
        <beans:property name="dataSource" ref="securityDB"/>
        <beans:property name="authoritiesByUsernameQuery" value="select username,role_id from app_user,user_role where app_user.id = user_role.user_id and username=?"/>
        <beans:property name="usersByUsernameQuery" value="select id,username,password,account_enabled from app_user where username = ?"/>
</beans:bean>

<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="myJdbcDaoImpl">
       <password-encoder hash="sha"/>
</authentication-provider>

問題は、私が

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

例外 java.lang.ClassCastException: org.springframework.security.core.userdetails.User cannot be cast to package.MyUser が発生します

SecurityContextHolder からの追加フィールドを使用してユーザー オブジェクトにアクセスするにはどうすればよいですか?

ありがとう

4

2 に答える 2

3

間違ったメソッドをオーバーライドしました。さらに、以下createUserDetailsを介してフェッチされたこれらから最終的なUserオブジェクトを作成するオーバーライドを行いましたloadUsersByUsername

@Override
protected UserDetails createUserDetails(final String username,
    final UserDetails userFromUserQuery,
    final List<GrantedAuthority> combinedAuthorities) {
  String returnUsername = userFromUserQuery.getUsername();

  if (!isUsernameBasedPrimaryKey()) {
    returnUsername = username;
  }

  final MyUser userToReturn = new MyUser(returnUsername,
      userFromUserQuery.getPassword(), userFromUserQuery.isEnabled(), true,
      true, true, combinedAuthorities);
  userToReturn.setId(((MyUser) userFromUserQuery).getId());
  return userToReturn;
}

userToReturn.setId(((MyUser) userFromUserQuery).getId());コードを使用した場合は機能します。または、ドキュメントに記載されているloadUsersByUsernameIDを削除してフェッチすることもできます。createUserDetails

loadUserByUsernameメソッドによって返される最終的なUserDetailsObjectの作成をカスタマイズするためにオーバーライドできます。

于 2012-08-22T21:24:26.250 に答える
0

私自身の質問に答える-

この問題は、JdbcDaoImplからのloadUserByUsername(String username)をオーバーライドしていませんでした。

したがって、JdbcDaoImplのloadUserByUsername(String username)の実装が呼び出されていました。これは、内部で最初にloadUsersByUsername(String username)を呼び出していましたが、その後、上記で返されたMyUserオブジェクトに付与された権限を追加し、org.springframework.security.core.userdetailsとして返していました。 .Userオブジェクト。

于 2012-08-22T21:23:04.833 に答える