[英]Spring Security - Account Authorization
我正在一个项目中,用户只能查看其帐户信息。 以下是示例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
任何想法都将适用。 谢谢。
可以在方法本身上应用此方法,而不是在配置文件中应用安全性。
请从配置文件中删除antMatchers("/clients").hasRole("ADMIN")
。
并更新您这样的方法:
@RequestMapping(value = "/clients")
@PreAuthorize("hasRole('ADMIN')")
另一个方法是:
@RequestMapping(value = "/clients/{id}")
@PreAuthorize("hasAnyRole('ADMIN','USER')")
这将起作用!
我只想指出不是快速交付而是不同的选择。 可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.