Ok, por lo que separar la autenticación de la autorización como se mencionó en la publicación de Samuel fue muy útil. Sin embargo, todavía hay muchos errores y encontré que la desauthentication todavía es un deber porque no hay una manera fácil en la primavera para agregar nuevos roles al usuario. Por lo tanto, la forma más fácil es obligar al usuario a iniciar sesión de nuevo y dejar que la primavera asuma la asignación de roles durante el inicio de sesión.
Para usuario Anular la en la seguridad de resorte que tiene que invocar:
SecurityContextHolder.clearContext();
como una alternativa que puede lanzar una excepción en su aplicación UserDetailsService (ver más abajo). Tiene la desventaja de que se desauthenticaría al usuario y se perderían los datos de contexto del usuario por lo que sería imposible hacer coincidir el nuevo usuario con la cuenta abierta durante el proceso de creación de una nueva cuenta local. Y debe coincidir con esas cuentas después de iniciar sesión con el nombre de usuario y la contraseña tradicionales. Mi solución fue desauthenticar al usuario justo después de crear una nueva cuenta.
Con el fin de otorgar funciones de usuario (privilegios), tiene que anular UserDetailsService, en caso de que alguien encuentre esto útil aquí es mi aplicación:
public final class MyUserDetailsService implements UserDetailsService {
private final UsersDao usersDao;
@Autowired
public UserDetailsServiceImpl(final UsersDao usersDao) {
this.usersDao = usersDao;
}
@Override
public UserDetails loadUserByUsername(final String username) {
UserEntity user = usersDao.getUserByOpenIdIdentifier(username);
if (user == null) {
// there is no such user in our db, we could here throw
// an Exception instead then the user would also be deuthenticated
return new User(username, "", new ArrayList<GrantedAuthority>());
}
//here we are granting to users roles based on values from db
final Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority(user.getUserType().toString()));
final UserDetails result = new User(username, "", authorities);
return result;
}
}