Spring REST 的安全性 api 没有 web.xml

Spring security for REST api without web.xml

我是 Spring 的新手,所以请多多包涵。我遵循了入门教程 here

所以我目前拥有的是 Eclipse 中的一个 Web 项目,我可以在其中使用 @RequestMapping 创建方法,并处理特定路径和 requestparams/pathparams。 我没有 web.xml,我只有 Application.java,在 main 方法中有以下代码,没有注释等:

SpringApplication.run(Application.class, args);

目前,这工作正常。但是我想实施一些安全措施来限制对我 API 某些部分的访问。更具体地说,会有很多 'event' objects(想想婚礼、生日等)。每个用户都可以在该事件中扮演角色,例如新娘、新郎、生日女孩、客人。 Alice可能是事件1的寿星,事件2的新娘,与事件3无关

只有担任特定角色时,他们才能获得有关该事件的信息。我见过很多具有简单角色的安全配置,但这里的角色取决于事件。我也没有大多数其他人提到的 web.xml,所以我很难开始。我不知道 Spring 安全是否是前进的方向。

由于我是新手,任何指向正确方向的指示都会很棒。我已经使用 Hibernate 实现了与数据库的连接,这是可以使用的,我可以创建一个 "custom" 解决方案,但我认为我遗漏了一些东西,也许是在重新发明轮子。我目前的解决方案是创建一个 AuthHandler,我直接从控制器中的方法调用它,并用 @RequestMapping 注释,事件 ID 和 username/password 通过 Authorization 传递header 其中 returns 枚举 Role。有没有更好的方法?

谢谢,

tl;dr 看看 this post series covering REST APIs


查看 https://spring.io/guides/gs/securing-web/#initial,因为您使用的是 Spring 引导和指南,这部分展示了如何构建基本安全性,但您也可以将它们扩展到您的角色,例如

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .antMatchers("/buffet")
                .hasAnyRole("BRIDE","GROOM","BDAY")
                .antMatchers("/andSoOn").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

如果您想在数据库 ("of course you want") 中保存用户和角色,请查看 UserDetailsUserDetailsService 查看 Rob Winch's github repo 中的示例,Spring Security的项目负责人,可以给你指明方向,你还需要实现某种权限匹配器,所以你加载用户,获取其权限,与静态列表匹配,然后它将建立授权

如果你想要 method/class/controller 级别的保护,你可以用 @EnableGlobalMethodSecurity(prePostEnabled = true) 注释配置 class,这将启用 @PreAuthorize('hasAnyRole("FOO")')@PostAuthorize('hasAnyRole("FOO")')

您还可以让 "in-memory" 用户在同一配置中 class:

@Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
              .withUser("lovelyOne").password("hothusband").roles("BRIDE");
    }

还有一些文档 here 供您跟进

PS: 你不需要只在 permitAll(String)hasAnyRole(String) 上中继你还有 hasRole(String),isAuthenticated #authenticated() #anonymous,据我所知