在ResourceSupport中设置表单字段的正确位置,在实体中不存在

时间:2014-09-10 04:34:02

标签: java spring spring-mvc spring-hateoas

我有一个用于在我的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返回/在域模型之上创建另一个表单模型实体并从服务返回。

这是我在许多地方遇到的基本问题,其中数据模型和表单一对一不匹配。

1 个答案:

答案 0 :(得分:1)

我强烈推荐以下内容;

  1. 修改UserService.login方法,根据成功的身份验证而不是从数据库中检索的用户对象返回true或false。
  2. 仅返回true或false,状态为OK和FAIL,作为响应的一部分而不是整个AuthLoginFormResource。这是一种不好的做法,因为您发送usernamepassword作为请求和响应的一部分,在往返中来回传递。如果有人在窃听,他们可以很容易地找出哪些用户名密码有效,哪些无效。
  3. 如果您喜欢这种自定义身份验证实施,请考虑使用基本授权,摘要授权或OAuth。使用Spring Security,您可以非常轻松地实现上述任何功能。