Spring 5 LDAP身份验证和JWT令牌作为响应

时间:2018-09-02 06:23:13

标签: java spring spring-security jwt spring-ldap

你好,我一直在尝试配置spring,如果用户/密码通过了LDAP Server的认证,它会返回JWT令牌;考虑下面的用例;

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。它已经可以接收请求并通过Web过滤器传递。

但是我还不太清楚如何验证对LDAP服务器的请求并发送JWT令牌。在我阅读的指南中,他们正在数据库中获取用户信息。

我已经阅读了WebConfiguration中有关LDAP配置的一些文档,但是我无法将其与当前的过滤器相关联。

1 个答案:

答案 0 :(得分:3)

请检查以下我使用Spring 4创建的链接。

配置您自己的ldap服务器,而不是使用classpath上的.ldif文件。

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

唯一的区别是应该使用Spring 5 先进的密码编码算法(如Bcryptpasswordencoder)。不推荐使用LDAPpasswordEncoder。

编码愉快!