关于Rest风格的API的如何做权限控制

发布于 2022-09-02 08:55:09 字数 346 浏览 13 评论 0

想要实现的效果是

比如如下两个接口
GET /order/{orderId}

POST /order/{orderId}/abc/{abcId}

想通过不同的角色或用户来分别限制他们能访问接口的某一个,即拥有权限的一个

现在的问题就是,通过什么样的方式能够将URL和上面的接口路径分别匹配上呢?
使用的是SpringMVC。

注:上面写的接口URL只是简单的,还有复杂的里面参数可以是正则表达式,或者两个参数通过特定字符串拼接的(如{param1}-{param2},所以匹配路径不能用正则来做,这块不太了解SpringMVC的底层是如何实现的,求大神解答。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

兔小萌 2022-09-09 08:55:09

怎么感觉你的问题内容和标题不是一个意思。你到底是想问权限控制还是路径识别匹配?

油饼 2022-09-09 08:55:09

你必須要用實作 WebSecurityConfigurerAdapter
以我所知Spring security基礎的登入是User跟Role.

每一個URL都可以通過實作 WebSecurityConfigurerAdapter的 configure(WebSecurity web)控制的。

比如以下的例子帳戶在內存,登入后各資源根制可以用上hasRole()限制:

        
@EnableWebSecurity
@Configuration
public class CustomWebSecurityConfigurerAdapter extends
   WebSecurityConfigurerAdapter {
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) {
    auth
      .inMemoryAuthentication()
        .withUser("user")  // #1
          .password("password")
          .roles("USER")
          .and()
        .withUser("admin") // #2
          .password("password")
          .roles("ADMIN","USER");
  }

  @Override
  public void configure(WebSecurity web) throws Exception {
    web
      .ignoring()
         .antMatchers("/resources/**"); // #3
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeUrls()
        .antMatchers("/signup","/about").permitAll() // #4
        .antMatchers("/admin/**").hasRole("ADMIN") // #6
        .anyRequest().authenticated() // 7
        .and()
    .formLogin()  // #8
        .loginUrl("/login") // #9
        .permitAll(); // #5
  }
}

參考: 官方文檔

离旧人 2022-09-09 08:55:09

楼主可以去学习一下shiro框架, 具体可以看这里, 非常不错的教程, 入门也简单, 这个框架可以解决你的问题.http://jinnianshilongnian.ite...
配合spring mvc使用起来就像是这样

@RestController
@RequestMapping("material")
public class MaterialController extends BaseController {
    @Autowired
    private MaterialService materialService;

    @RequestMapping(value = "{moduleId}/material", method = RequestMethod.GET)//限制了只接受get请求
    public Map queryMaterial(@PathVariable long moduleId) throws Exception {
        return resultMap(true, materialService.queryMaterial(moduleId));
    }

    @RequiresRoles("admin")//限制访问这个方法必须具备admin角色, 同样有RequiresPermission等其他权限注解
                           //可以根据不同的需求配置, 也可以通过其他方法实现动态权限控制
    @RequestMapping(value = "{moduleId}/preview", method = RequestMethod.GET)
    public Map preview(@PathVariable long moduleId) throws Exception {
        return resultMap(true, materialService.queryMaterialForPreview(moduleId));
    }
}
挽你眉间 2022-09-09 08:55:09

可以自己写一个方法

眼眸印温柔 2022-09-09 08:55:09

url/role_action/role_action_param/param
role_action_param作为权限对象保存,识别就全靠它,然后分配到各种路径

浪漫人生路 2022-09-09 08:55:09

http base 认证!!!!

可可 2022-09-09 08:55:09

可以考虑使用sureness, 原生支持路径匹配
https://su.usthe.com - https://github.com/tomsun28/s...
sureness 提供一个针对restful api无框架依赖,可以动态修改权限多认证策略更快速度易用的认证鉴权框架

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文