我正在尝试设计一个应该公开两个全局API路径的应用程序:
/
用户必须经过身份验证/public
无身份验证此外,如果未提供身份验证,/public
API将通过显示未授权的较少信息来提供某些/
API的简化版本。
即使Controller
不包含核心功能,其中一些也提供数据验证或其他检查。因此,如果我想创建当前API的/public
版本,我有4个解决方案:
@Autowired
/
控制器和使用方法调用forward
请求(我不能redirect
,因为将应用安全过滤器)Controller
和/
API /public
醇>
我的情景有没有好的做法或模式?
答案 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上,并根据需要提供服务。