如何使用权限保护rest api

时间:2017-11-23 08:24:39

标签: java spring rest security

我正在使用spring boot开发rest api服务,检查我使用令牌的权限 - 在登录请求中将密钥值保存到memcache,键入长度为50的令牌(字符串)并将其值作为您的id。为了能够访问任何休息请求,我的休息控制器将此标记作为get参数(与post,put相同的逻辑)获取,而不是获取用户的id(来自memcache)并检查此用户是否具有特定资源的权限。例如“carwashs / 2 PUT”洗车有FK到公司,用户也有FK到公司,如果这些FK类似你有更新洗车的权利。我正在寻找另一种方法来保护我的休息api使用弹簧安全因为当前方法不安全(我在url中看到令牌并在所有HTTP请求中使用get参数)。但是在官方文档中给出的示例中,Spring安全性似乎只适用于permisions枚举和登录页面。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.inMemoryAuthentication().withUser("anon").password("123456").roles("USER");
      auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
      auth.inMemoryAuthentication().withUser("userr").password("123456").roles("DBA");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
        .and().formLogin();

    }
}

如何使用这种方法检查特定洗车的许可?

1 个答案:

答案 0 :(得分:1)

您可以使用Spring安全性中的常见内置表达式,如

http.authorizeRequests().hasAuthority("ROLE_ADMIN").antMatchers("/dump/**")

或者您可以使用带有注释的方法安全表达式,如

@PreAuthorize("#id == user.companyId") 

你也可以看看那里

https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html