Jeśli zrozumiałem to poprawnie, problem polega na tym, że chcesz wyszukać nazwę użytkownika wprowadzoną przez użytkownika w dwóch różnych kolumnach bazy danych.
Oczywiście, możesz to zrobić, dostosowując UserDetailsService.
public class CustomJdbcDaoImpl extends JdbcDaoImpl {
@Override
protected List<GrantedAuthority> loadUserAuthorities(String username) {
return getJdbcTemplate().query(getAuthoritiesByUsernameQuery(), new String[] {username, username}, new RowMapper<GrantedAuthority>() {
public GrantedAuthority mapRow(ResultSet rs, int rowNum) throws SQLException {
.......
}
});
}
@Override
protected List<UserDetails> loadUsersByUsername(String username) {
return getJdbcTemplate().query(getUsersByUsernameQuery(), new String[] {username, username}, new RowMapper<UserDetails>() {
public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException {
.......
}
});
}
Twoja konfiguracja fasoli dla tej klasy będzie wyglądać mniej więcej tak.
<beans:bean id="customUserDetailsService" class="com.xxx.CustomJdbcDaoImpl">
<beans:property name="dataSource" ref="dataSource"/>
<beans:property name="usersByUsernameQuery">
<beans:value> YOUR_QUERY_HERE</beans:value>
</beans:property>
<beans:property name="authoritiesByUsernameQuery">
<beans:value> YOUR_QUERY_HERE</beans:value>
</beans:property>
</beans:bean>
Twoje pytania będzie wyglądać podobnie do tego
select username, password, enabled from user where (username = ? or email = ?)
select u.username, a.authority from user u join authority a on u.userId = a.userId where (username = ? or email = ?)
Spojrzałem na klasy, ale mam problem z ustaleniem, które metody powinienem nadpisać. Jakieś wskazówki? – tumanov
Myślę, że widzę to teraz: loadUserByUsername (String username) – tumanov