【问题标题】:Spring security for REST api without web.xml没有 web.xml 的 REST api 的 Spring 安全性
【发布时间】:2015-04-15 04:09:06
【问题描述】:

我对 Spring 还很陌生,所以请多多包涵。我遵循了入门教程here

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

SpringApplication.run(Application.class, args);

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

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

由于我是新手,任何指向正确方向的指针都会很棒。我已经使用 Hibernate 实现了与数据库的连接,这是可以使用的,我可以创建一个“自定义”解决方案,但我认为我错过了一些东西,也许是在重新发明轮子。我当前的解决方案是创建一个AuthHandler,我直接从控制器中的方法调用它,并用@RequestMapping 注释,并通过Authorization 标头传入事件ID 和用户名/密码,该标头返回一个枚举Role .有没有更好的办法?

谢谢,

【问题讨论】:

    标签: java spring hibernate spring-security web.xml


    【解决方案1】:

    tl;dr 看看this post series covering REST APIs


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

    @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();
        }
    

    如果你想在数据库中保存用户和角色(“当然你想要”)看看UserDetailsUserDetailsService看看这个例子Rob Winch's github repo,Spring Security的项目负责人,这可以为您指明正确的方向,您还需要为权限实现某种匹配器,因此您加载用户,获取其权限,与静态列表匹配,然后它将建立权限

    如果你想要方法/类/控制器级别的保护,你可以用@EnableGlobalMethodSecurity(prePostEnabled = true)注释配置类,这将启用@PreAuthorize('hasAnyRole("FOO")')@PostAuthorize('hasAnyRole("FOO")')

    您还可以在同一类中配置“内存中”用户:

    @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,据我所知

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 2017-12-05
      • 2015-03-18
      • 2014-02-24
      • 2012-03-06
      • 2014-04-27
      • 2015-05-22
      • 2015-09-08
      • 2016-03-29
      相关资源
      最近更新 更多