我有一个用于在我的REST API中登录用户的模型,对应于用户表(电子邮件和密码作为表列)
@Entity
public class User {
@Id
@GeneratedValues
private Long id;
private String email;
private String password;
+GET , +SET
}
然后有@Controller使用JPAService
调用上面的User Entity @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;
}
}
有两个问题 -
我需要发送一个成功标志作为响应,我已经向AuthLoginFormResource添加了一个布尔成功。但是,AuthLoginFormResource已设置 只能从AuthLoginFormResourceAsm.toResource方法中获得 它来自实体用户。用户实体模型所在的数据库 没有成功专栏,我无法在这个地方取得成功。
那么,我应该向用户实体添加虚拟成功字段并从服务中设置它 方法,虽然数据库中没有这样的字段,或者在这里创建一个表示登录表单的新实体并返回它?
与另一个作为身份验证令牌的字段存在同样的问题 数据库中不存在,但是是响应的一部分。
在ResourceSupport对象中设置此类字段的正确位置 - 在数据库内部实体并从Service返回/在域模型之上创建另一个表单模型实体并从服务返回。
这是我在许多地方遇到的基本问题,其中数据模型和表单一对一不匹配。
答案 0 :(得分:1)
我强烈推荐以下内容;
UserService.login
方法,根据成功的身份验证而不是从数据库中检索的用户对象返回true或false。AuthLoginFormResource
。这是一种不好的做法,因为您发送username
和password
作为请求和响应的一部分,在往返中来回传递。如果有人在窃听,他们可以很容易地找出哪些用户名密码有效,哪些无效。或
如果您喜欢这种自定义身份验证实施,请考虑使用基本授权,摘要授权或OAuth。使用Spring Security,您可以非常轻松地实现上述任何功能。