繁体   English   中英

Spring Security-帐户授权

[英]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')")

这将起作用!

我只想指出不是快速交付而是不同的选择。 可以使用ApiRequestInterceptorSecurityContextHolder *完成。 在此拦截器中,您可以预处理请求。 您需要三个表用于角色,授权及其关系。 关于请求所有者的角色,您可以填充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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM