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") 中保存用户和角色,请查看 UserDetails
和 UserDetailsService
查看 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
,据我所知
我是 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") 中保存用户和角色,请查看 UserDetails
和 UserDetailsService
查看 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
,据我所知