春の秘密の質問です。
を使用してカスタム 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 からの追加フィールドを使用してユーザー オブジェクトにアクセスするにはどうすればよいですか?
ありがとう