0

我在我的 REST API 中有一个用于登录用户的模型,对应于用户表(电子邮件和密码作为表列)

@Entity
public class User {

@Id
@GeneratedValues
private Long id;

private String email;
private String password;

+GET , +SET

}

然后是@Controller,它正在使用 JPAService 调用上述用户实体

    @Controller
    @RequestMapping("/rest/auths")
    public class AuthController {

        @Autowired    
        private UserService authService;

        @RequestMapping(value = "/login", method = RequestMethod.POST)
            public @ResponseBody ResponseEntity<AuthLoginFormResource> login(@RequestBody AuthLoginFormResource sentAuth) {

            User user = authService.login(sentAuth.toUser());
            AuthLoginFormResource res = new AuthLoginFormResourceAsm().toResource(user); 

            HttpHeaders headers = new HttpHeaders();
                headers.setLocation(URI.create(res.getLink("self").getHref()));

                return new ResponseEntity<AuthLoginFormResource>(res, HttpStatus.OK);
            }
       }

AuthLoginFormResource:-

        public class AuthLoginFormResource extends ResourceSupport {

            private String email;
            private String password;
            private boolean success;

        public User toUser() { 

            User user = new User(); 
            user.setEmail(email);
            user.setPassword(password);
            //user.setSuccess(false);
            return user;

        }
        +GET, +SET
    }

AuthLoginFormResourceAsm:-

    public class AuthLoginFormResourceAsm extends ResourceAssemblerSupport<User, AuthLoginFormResource> {

        public AuthLoginFormResourceAsm() {
            super(User.class, AuthLoginFormResource.class);
        }

        @Override
        public AuthLoginFormResource toResource(User user) {

            AuthLoginFormResource res = new AuthLoginFormResource();
            res.setEmail(user.getEmail());
            res.setPassword(user.getPassword());
            //res.setSuccess(user.isSuccess()); // Success is not existing in USER

            res.add(linkTo(AuthController.class).withSelfRel());

            return res;
        }

    }

有2个问题-

  • 我需要发送一个成功标志作为布尔值作为响应,为此我已将布尔值成功添加到 AuthLoginFormResource。但是,AuthLoginFormResource 仅从 AuthLoginFormResourceAsm.toResource 方法中设置,而后者又从实体用户中进行设置。由于没有成功列的用户实体模型数据库,我无法在这个地方设置成功。

    那么,我应该向用户实体添加虚拟成功字段并从服务方法中设置它,尽管数据库中没有这样的字段还是在这里创建一个代表登录表单的新实体并返回它?

  • 另一个字段存在同样的问题,该字段是用于身份验证的令牌,该令牌在数据库中不存在,但属于响应的一部分。

在 ResourceSupport 对象中设置此类字段的正确位置是什么 - 在数据库实体内部并从服务返回/在域模型之上创建另一个表单模型实体并从服务返回。

这是我在许多数据模型和表单不一对一匹配的地方面临的基本问题。

4

1 回答 1

1

我强烈推荐以下内容;

  1. 修改UserService.login方法以根据成功的身份验证返回 true 或 false,而不是从数据库中检索到用户对象。
  2. 仅返回 true 或 false 状态为 OK 和 FAIL,作为响应的一部分而不是整个AuthLoginFormResource. 这是一种不好的做法,因为您将usernameandpassword作为请求和响应的一部分在往返中来回发送。如果有人窃听,他们可以很容易地找出哪些用户名密码有效,哪些无效。

或者

如果您喜欢这种自定义身份验证实现,请考虑使用基本授权、摘要授权或 OAuth。使用 Spring Security,您可以非常轻松地实现上述任何一项。

于 2014-09-11T08:30:38.557 回答