Zbadam te eventy.
Robiłem coś takiego dotychczas:
@Service
public class CustomClientDetailsService implements UserDetailsService {
private ClientRepository clientRepository;
private SessionData session;
@Autowired
public void setUserRepository(ClientRepository clientRepository, SessionData session) {
this.clientRepository = clientRepository;
this.session = session;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
ClientEntity client = clientRepository.findByEmail(username);
if(client == null) throw new UsernameNotFoundException("client not found");
org.springframework.security.core.userdetails.User userDetails =
new org.springframework.security.core.userdetails.User(
client.getEmail(),
client.getPassword(),
convertAuthorities(client.getRoles())
);
client.setLastLogin(new Date());
clientRepository.save(client);
session.put("client", client);
return userDetails;
}
private Set<GrantedAuthority> convertAuthorities(Set<ClientRoleEntity> userRoles) {
Set<GrantedAuthority> authorities = new HashSet<>();
for(ClientRoleEntity ur: userRoles) {
authorities.add(new SimpleGrantedAuthority(ur.getRole()));
}
return authorities;
}
[...]
Ale nie wiem w jakim momencie wywoływana jest ta metoda i czy wywołanie jej oznacza poprawne zalogowanie.
Poza tym dzieje się to czego nie chciałem:
**Hibernate**: select cliententi0_.id as id1_1_, cliententi0_.activated as activate2_1_, cliententi0_.activated_date as activate3_1_, cliententi0_.address1 as address4_1_, cliententi0_.address2 as address5_1_, cliententi0_.blocked as blocked6_1_, cliententi0_.blocked_reason as blocked_7_1_, cliententi0_.email as email8_1_, cliententi0_.first_name as first_na9_1_, cliententi0_.last_access as last_ac10_1_, cliententi0_.last_login as last_lo11_1_, cliententi0_.last_name as last_na12_1_, cliententi0_.password as passwor13_1_, cliententi0_.phone as phone14_1_, cliententi0_.registration_date as registr15_1_, cliententi0_.zip_code as zip_cod16_1_ from clients cliententi0_ where cliententi0_.email=?
**Hibernate**: select roles0_.client_entity_id as client_e1_2_0_, roles0_.roles_id as roles_id2_2_0_, clientrole1_.id as id1_3_1_, clientrole1_.description as descript2_3_1_, clientrole1_.role as role3_3_1_ from clients_roles roles0_ inner join roles clientrole1_ on roles0_.roles_id=clientrole1_.id where roles0_.client_entity_id=?
pl.test.component.SessionData@62d34de9 created
**Hibernate**: select cliententi0_.id as id1_1_0_, cliententi0_.activated as activate2_1_0_, cliententi0_.activated_date as activate3_1_0_, cliententi0_.address1 as address4_1_0_, cliententi0_.address2 as address5_1_0_, cliententi0_.blocked as blocked6_1_0_, cliententi0_.blocked_reason as blocked_7_1_0_, cliententi0_.email as email8_1_0_, cliententi0_.first_name as first_na9_1_0_, cliententi0_.last_access as last_ac10_1_0_, cliententi0_.last_login as last_lo11_1_0_, cliententi0_.last_name as last_na12_1_0_, cliententi0_.password as passwor13_1_0_, cliententi0_.phone as phone14_1_0_, cliententi0_.registration_date as registr15_1_0_, cliententi0_.zip_code as zip_cod16_1_0_ from clients cliententi0_ where cliententi0_.id=?
**Hibernate**: select roles0_.client_entity_id as client_e1_2_0_, roles0_.roles_id as roles_id2_2_0_, clientrole1_.id as id1_3_1_, clientrole1_.description as descript2_3_1_, clientrole1_.role as role3_3_1_ from clients_roles roles0_ inner join roles clientrole1_ on roles0_.roles_id=clientrole1_.id where roles0_.client_entity_id=?
**Hibernate**: update clients set activated=?, activated_date=?, address1=?, address2=?, blocked=?, blocked_reason=?, email=?, first_name=?, last_access=?, last_login=?, last_name=?, password=?, phone=?, registration_date=?, zip_code=? where id=?
2 dodatkowe zapytania SQL..
A ja chce zrobić
client.setLastLogin(new Date());
clientRepository.save(client);
w momencie gdy jestem pewny że użytkownik się zalogował i korzystając z clientEntity którego pobrał spring (z bazy danych) podczas autoryzacji w celu sprawdzenia hasła.