java - Spring Security,方法安全注释( @Secured ) 无效( java配置)

  显示原文与译文双语对照的内容

我正在尝试使用 @Secured("ADMIN") ( 。没有任何 XML,只有java配置,spring 引导) 设置一个方法安全注释。 但是通过角色的访问不工作。

安全配置:


@Configuration
@EnableWebSecurity
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter{

.....

@Override
 protected void configure(HttpSecurity http) throws Exception {
 http
. authorizeRequests()
. antMatchers("/api/**").fullyAuthenticated().and()
. addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
 }

.....

}

我希望限制对控制器方法的访问:


@RestController
@RequestMapping("/api/groups")
public class GroupController {

 @Autowired
 private GroupService groupService;

 @Secured("ADMIN")
 @RequestMapping
 public List<Group> list() {
 return groupService.findAll();
 }

}

通过url限制访问,使用:


.antMatchers("/api/**").hasAuthority("ADMIN")

可能我忘记指定要按角色限制?

按规则收费:: 在控制器层或者服务层中必须在什么层上使用 @PreAuthorize("hasRole('ADMIN')")

时间:

请添加这个


@EnableGlobalMethodSecurity(securedEnabled = true)

这个元素用于在应用程序的( 通过在元素上设置适当的属性) 中启用注释,并将安全切入点声明组合在一起,这些声明将在整个应用程序上下文中特别适用于面向 因此你的代码应该如下所示


@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter{..

可能有许多原因导致控制器上的方法安全性无法工作。

因为它从未被引用为 Spring Security 手册中的例子。 joking,但在他们不想去的地方采取 spring 工具可能是棘手的。

更重要的是,你应该启用方法安全性,如 @Mudassar. 所说 手册上写着:

因此,我们可以使用任何实例上的@EnableGlobalMethodSecurity 注释来启用基于注释的安全。 例如下面的命令将启用安全注释的spring @Secured


@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig {
//...
}

请注意mudassar的答案是正确的直到这里。

但是方法安全性基于 AOP,默认情况下,它在接口使用JDK代理。 这就是所有示例都在服务层上应用方法安全的原因,因为服务类通常被注入控制器。

你当然可以在控制器层使用它,但是:

  • 所有的控制器都为你实现了所有 @Secured 注释的方法
  • 或者你必须 switch 到类代理

我试图遵循的规则是:

  • 如果我想保护一个 URL,我就坚持 HTTPSecurity
  • 如果需要允许细粒度访问,我在服务层添加安全性

这里问题已经解决。

我添加 @EnableGlobalMethodSecurity(prePostEnabled = true)


@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter{
}

在控制器中,我将 @Secured("ADMIN") 更改为 @PreAuthorize("hasRole('ADMIN')")

...