Spring Security-帐户授权

时间:2018-09-04 13:23:49

标签: java spring-boot spring-security

我正在一个项目中,用户只能查看其帐户信息。 以下是示例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

任何想法都会被采纳。谢谢。

2 个答案:

答案 0 :(得分:0)

您可以在方法本身上应用此方法,而不是在配置文件中应用安全性。

请从配置文件中删除antMatchers("/clients").hasRole("ADMIN")

并更新您这样的方法:

@RequestMapping(value = "/clients")
@PreAuthorize("hasRole('ADMIN')")

另一种方法是:

@RequestMapping(value = "/clients/{id}")
@PreAuthorize("hasAnyRole('ADMIN','USER')")

这可以工作!

答案 1 :(得分:0)

我只想指出不是快速交付而是不同的选择。可以使用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