Spring REST设计公开且经过身份验证的API

时间:2015-12-15 11:29:41

标签: spring rest

我正在尝试设计一个应该公开两个全局API路径的应用程序:

  • /用户必须经过身份验证
  • /public无身份验证

此外,如果未提供身份验证,/public API将通过显示未授权的较少信息来提供某些/ API的简化版本。

即使Controller不包含核心功能,其中一些也提供数据验证或其他检查。因此,如果我想创建当前API的/public版本,我有4个解决方案:

  1. 重复代码
  2. @Autowired /控制器和使用方法调用
  3. forward请求(我不能redirect,因为将应用安全过滤器)
  4. 创建管理Controller/ API
  5. /public

    我的情景有没有好的做法或模式?

2 个答案:

答案 0 :(得分:1)

恕我直言,解决这个问题的最佳方法是使用第四种解决方案。 第一个解决方案:计算机科学的第一条规则是你不要复制你的代码。

第二个解决方案:从另一个控制器调用控制器是一个严重的设计缺陷。

第三种解决方案:可能是一个解决方案,但由你排除。

第四种解决方案:恕我直言最好的一个

class MyController{

    @RequestMapping("/getData")
    public ResponseObject getData(@RequestBody SomeDTO dto){
      Validator.validate(dto);
      return myService.getData(dto);
}

    @RequestMapping("/public/getData")
    public ResponseObject getPublicData(@RequestBody SomeDTO dto){
      Validator.validate(dto);
      return myService.getPublicData(dto);
}
}

过滤服务层中的数据。

答案 1 :(得分:0)

使用Spring Security可以实现。 首先,您需要在没有安全性的情况下调用此URL,如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception {

        /** some security code **/
        http
            .authorizeRequests().antMatchers("/resources/**","/public/**").permitAll().anyRequest().authenticated().and()
        /** other stuffs **/

}

@RestController
@RequestMapping(value="/public")
public class PublicRestController {

    @Autowired private DataRepository data;

    @RequestMapping(value = "/data/",method = RequestMethod.GET)
    public Model getModelData(){
    /** Do what you need here **/
    }
}

因此,您所要做的就是构建一个与您的URL匹配的REST控制器,您就完成了。

正如您所建议的那样,使用@Autowired仅公开您需要的代码。因此,您可以将所有登录信息放在服务/组件bean上,并根据需要提供服务。