我正在一个项目中,用户只能查看其帐户信息。 以下是示例API:
http://example.com/clients->只有管理员可以拨打电话
http://example.com/clients/1->管理员和ID = 1的客户端可以呼叫
http://example.com/clients/2->管理员和ID = 2的客户端可以呼叫
希望您能理解我的意思。
第一个解决方案:
首先,基于用户登录时的身份验证令牌,如果他尝试访问其他帐户的信息(当然,如果他不是管理员),我将抛出异常。该解决方案效果很好。
第二个解决方案:
我尝试使用Spring Security做同样的事情,但是我坚持授权模式。您是否知道如何使用Spring Security做同样的事情?
http.authorizeRequests().antMatchers("/clients").hasRole("ADMIN");
//I could not go further with each client
任何想法都会被采纳。谢谢。
答案 0 :(得分:0)
您可以在方法本身上应用此方法,而不是在配置文件中应用安全性。
请从配置文件中删除antMatchers("/clients").hasRole("ADMIN")
。
并更新您这样的方法:
@RequestMapping(value = "/clients")
@PreAuthorize("hasRole('ADMIN')")
另一种方法是:
@RequestMapping(value = "/clients/{id}")
@PreAuthorize("hasAnyRole('ADMIN','USER')")
这可以工作!
答案 1 :(得分:0)
我只想指出不是快速交付而是不同的选择。可以使用ApiRequestInterceptor
和SecurityContextHolder
*来完成。在此拦截器中,您可以预处理请求。您需要三个表用于角色,授权及其关系。关于请求所有者的角色,您可以填写SecurityContextHolder
。
public class ApiRequestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//get token
List<String> grantedAuthorities = new ArrayList<>();
grantedAuthorities.addAll(token.getRoles());
//get authorized pages via service
final List<String> authPages= service.getAuthPages(grantedAuthorities);
SecurityContextHolder.getContext().setAuthentication(authPages)
return true;
}
}
您也可以在任何控制器中使用上下文持有者。我愿意接受任何反馈,因为我可能表示不好。
*:当请求到来时,将在一个新线程上对其进行处理,并且每个线程都有一个不同的SecurityContextHolder
。这是文档:https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/apidocs/org/springframework/security/core/context/SecurityContextHolder.html