Весенняя аутентификация с LDAP - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь подключиться к базе данных LDAP из конфигурации Spring.

У меня есть несколько классов, таких как "LDAPConfig", "WebSecurityConfig", "JwtFilter", которые работают.

Я также сделал больше этого, класс "AuthentificationServiceImpl", который реализует "AuthenticationService"

@Service
public class AuthentificationServiceImpl implements AuthentificationService {

    static final Logger logger = LoggerFactory.getLogger(AuthentificationServiceImpl.class);

    /**
     * {@link AuthenticationManager}
     */
    @Autowired
    private AuthenticationManager authenticationManager;

    /**
     * {@link LdapUserDetailsService}
     */
    @Autowired
    private LdapUserDetailsService ldapUserDetailsService;

    /**
     * {@link TokenProvider}
     */
    @Autowired
    private TokenProvider tokenProvider;

    /**
     * the {@link UserService}
     */
    @Autowired
    private UserService userService;


    /**
     * Authentification method of a user with his {@link CredentialDTO}
     * 
     * @Param - the {@link CredentialDTO} (username and password of the user)
     * @Return - The {@link DocumentDTO}
     */
    public String authentification(CredentialLdap cred) {
        logger.info("Test de creation d'un token");
        if (!cred.getUsername().equals("admin")) {
            String decodedPassword = new String(Base64.getDecoder().decode(cred.getPassword()));
            UsernamePasswordAuthenticationToken authUserPassword = new UsernamePasswordAuthenticationToken(
                    cred.getUsername(), decodedPassword);
            try {
                Authentication auth = authenticationManager.authenticate(authUserPassword);
                SecurityContextHolder.getContext().setAuthentication(auth);
                if (auth.isAuthenticated()) {
                    UserDTO user = userService.getUserByLogin(cred.getUsername());
                    if (user == null) {
                        return null;
                    }
                }
                UserDetails userDetails = ldapUserDetailsService.loadUserByUsername(cred.getUsername());

                JwtUser jwtUser = new JwtUser(userDetails.getUsername(),
                        new Date(Calendar.getInstance().getTimeInMillis() + 3600 * 1000),
                        new ArrayList<>(userDetails.getAuthorities()));

                return tokenProvider.generateToken(jwtUser);

            } catch (BadCredentialsException bce) {
                logger.warn("User not available or not authorized :" + bce.getLocalizedMessage());
                throw bce;
            }
        } else {
            UserDTO user = userService.getUserByLogin(cred.getUsername());
            String decodedPassword = new String(Base64.getDecoder().decode(cred.getPassword()));
            String userDecodedPassword = new String(Base64.getDecoder().decode(user.getPassword()));
            if (decodedPassword.equals(userDecodedPassword)) {
                List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>();
                SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_ADMIN");
                updatedAuthorities.add(authority);

                JwtUser jwtUser = new JwtUser(cred.getUsername(),
                        new Date(Calendar.getInstance().getTimeInMillis() + 3600 * 1000),
                        new ArrayList<>(updatedAuthorities));

                return tokenProvider.generateToken(jwtUser);
            } else {

            }

        }
        return null;
    }

public interface AuthentificationService {

    public String authentification(CredentialLdap credential);

}

Когда я тестирую Почтальон, я получаю сообщение об ошибке «Доступ к запрошенному ресурсу запрещен».

По данным отладки сервер правильно получает мои идентификаторы и блоки в шаге:

Authentication auth = authenticationManager.authenticate(authUserPassword);

Спасибо за вашу помощь, если другие классы необходимы, я могу добавить их.

...