在Jhipster用户身份验证中添加自定义验证

时间:2019-06-20 08:32:24

标签: angular spring spring-boot spring-security jhipster

由于Jhipster(Angular + Springboot Scaffolding)使用JWT进行身份验证,因此我们有一个自定义的登录模型来检查用户身份验证。现在代码如下所示(UserJWTController.java):

   @PostMapping("/authenticate")
    @Timed
    public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) {

        UsernamePasswordAuthenticationToken authenticationToken =
            new UsernamePasswordAuthenticationToken(loginVM.getUsername(), loginVM.getPassword());
        Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
        String jwt = tokenProvider.createToken(authentication, rememberMe);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add(JWTConfigurer.AUTHORIZATION_HEADER, "Bearer " + jwt);
        return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
    }

它观察到,当用户输入无效的凭据时,将引发错误。前端(角度)通过在模式本身内显示Text来处理错误。Something like this

现在,假设我还需要添加一个自定义验证。例如,我需要检查该用户的姓氏是否为“ Mike”,然后引发一个自定义错误,提示“ Mike无法登录”。

问题是 authenticate()(org.springframework.security.authentication.AuthenticationManager) 默认情况下,该方法将抛出DisabledException,LockedException和BadCredentialsException。

我没有Spring Security的经验,所以我不太了解如何覆盖类并添加所需的功能。

此外,Angular捕获了一个通用的Exception,所以我的猜测是我们需要添加另一个约束:

.catch(() => {
                this.authenticationError = true;
            });

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

正如我所说的here,您要做的就是

1-通过添加所需的验证并使用此伪代码中的以下操作更改您的authorize请求方法

 if(!userService.checkUsername(username)){
        throw new CustomParameterizedException("error.EK_L_C01", username);
        // or use the BadRequestAlertException  you can see how to use it in the UserResource.java
    }

但是在我看来,这没有被建议,因为当您将使用jhipster更新或向您的应用程序添加一些功能时,他可能会重写您的类,并且您必须通过git cherry-pick处理此代码丢失或您喜欢的另一种方式

因此,我相信使用过滤器是一种更好的方法,因为我已经使用JHipster进行了最佳实践,那就是绝不改变生成的代码,

您可以使用本教程来创建过滤器:using a bean@WebFilter annotation

您要做的就是在此过滤器中进行验证后抛出异常

不要忘记针对所有语言更新webapp国际化文件夹i18n中的错误消息