Проверка подлинности LDAP Spring 5 и токен JWT в качестве ответа - PullRequest
0 голосов
/ 02 сентября 2018

Здравствуйте. Я пытался настроить Spring так, чтобы он возвращал токен JWT, если пользователь / пароль аутентифицирован на сервере LDAP; Рассмотрим пример использования ниже;

enter image description here

На приведенной выше диаграмме я настроил WebSecurity для проверки / фильтрации запросов с Bearer. Смотрите код ниже

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationEntryPoint unauthorizedHandler;

    @Autowired
    JwtAuthorizationTokenFilter authenticationTokenFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Configure Web Security
        // Allow only /auth/
        // Disallow all others
        http
        .csrf().disable()
        .exceptionHandling().authenticationEntryPoint(unauthorizedHandler)
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .authorizeRequests()
        .antMatchers(HttpMethod.POST,
                     "/auth/**")
        .permitAll()
        .anyRequest().authenticated();      

        //Custom JWT 
        http.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

        // disable page caching
        http.headers().cacheControl();

    }
}

AuthCtrl.java

@RestController
@RequestMapping("auth")
public class AuthCtrl {

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

    @Autowired
    @Qualifier("authenticationManagerImpl")
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Autowired
    @Qualifier("userDetailsServiceImpl")
    private UserDetailsService userDetailsService;

    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) 
    public @ResponseBody String post(@RequestBody Map<String, String> credentials) {
        logger.info("POST: {} | {} ",credentials.get("username"), credentials.get("password"));
        String username = credentials.get("username");
        String password = credentials.get("password");

        Objects.requireNonNull(username);
        Objects.requireNonNull(password);

        try {
            authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
            // Reload password post-security so we can generate the token
            final UserDetails userDetails = userDetailsService.loadUserByUsername(username);
            final String token = jwtTokenUtil.generateToken(userDetails);
            return token;
        } catch (DisabledException e) {
            throw new AuthenticationException("User is disabled!", e);
        } catch (BadCredentialsException e) {
            throw new AuthenticationException("Bad credentials!", e);
        }
    }

    @ExceptionHandler({AuthenticationException.class})
    public ResponseEntity<String> handleAuthenticationException(AuthenticationException e) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(e.getMessage());
    }
}

Приведенная выше конфигурация была основана на руководстве youtube , которое я видел, а также на демонстрационном источнике в git . Отличная помощь !, кредиты владельцам. Нужно понять, как фильтры работают как-то.

Приведенный выше источник уже может отфильтровать все защищенные API и отослать несанкционированный ответ как ответ, когда он не авторизован. Единственный API, к которому мне разрешен анонимный доступ, это API аутентификации /auth. Он уже может получить запрос и пройти через веб-фильтры.

Но я не могу понять, как аутентифицировать указанный запрос к серверу LDAP и отправляет токен JWT. В руководстве, которое я прочитал, они получают информацию о пользователях в базе данных.

Я прочитал некоторую документацию по конфигурации LDAP в WebConfiguration, но не могу связать ее с моими текущими фильтрами.

1 Ответ

0 голосов
/ 24 октября 2018

Пожалуйста, проверьте ссылку ниже, я создал его с помощью весны 4.

Вместо файла .ldif на classpath настройте свой собственный сервер ldap.

https://github.com/merugu/springsecurity/tree/master/ldapauthenticationjwttoken

Единственное отличие - для Spring 5 вы должны использовать усовершенствованный алгоритм кодирования паролей, такой как Bcryptpasswordencoder. Поскольку LDAPpasswordEncoder устарел.

Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...