[英]Proper place for setting form fields in ResourceSupport which don't exist in Entity
我有一个用于在我的REST API中登录用户的模型,对应于User表(电子邮件和密码作为表列)
@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添加了布尔值成功。 但是,只能通过AuthLoginFormResourceAsm.toResource方法设置AuthLoginFormResource,而AuthLoginFormResource方法则是通过实体User进行设置的。 由于用户实体模型数据库没有成功列,因此我无法在此设置成功。
因此,我应该将虚拟成功字段添加到用户实体并从服务方法中进行设置,尽管数据库中没有这样的字段,还是在此处创建一个代表登录表单的新实体并返回?
与另一个字段相同的问题是身份验证令牌,该字段在数据库中不存在,但是是响应的一部分。
在ResourceSupport对象中设置此类字段的正确位置是什么-在数据库实体内部并从Service返回/在Domain Model顶部创建另一个Form Model实体并从Service返回。
这是我在许多数据模型和表单不一一对应的地方面临的基本问题。
我强烈建议以下内容:
UserService.login
方法以基于成功身份验证而不是从数据库中检索到的用户对象返回true或false。 AuthLoginFormResource
。 这是一种不好的做法,因为您是在往返中来回发送username
和password
作为请求和响应的一部分。 如果有人在窃听,他们可以轻松找出哪些用户名密码有效,哪些无效。 要么
如果您喜欢此自定义身份验证实现,请考虑使用基本授权,摘要授权或OAuth。 使用Spring Security,您可以真正轻松地实现上述任何目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.