Spring Security, Method Security annotation (@Secured ) 不工作 (java config)

我正在尝试使用@Secured(“ADMIN”)(没有任何XML,只有java配置,Spring Boot)设置方法安全注释。但是,通过角色进行访问不起作用。

安全配置:

@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")

也许我忘记指定我想要按角色限制?

UPD:根据规则,在控制器层或服务层中必须处于哪一层?@PreAuthorize("hasRole('ADMIN')")


答案 1

请添加此

@EnableGlobalMethodSecurity(securedEnabled = true)

此元素用于在应用程序中启用基于注释的安全性(通过在元素上设置适当的属性),以及将安全切入点声明组合在一起,这些声明将专门用于 应用于整个应用程序上下文。因此,您的代码应如下所示@Secured

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

答案 2

我知道这个线程已经很老了,我的答案暗示了这个线程中各种人的部分答案;但这里有一个陷阱和答案的组合列表:

  1. 当使用@Secured时,角色名称是(例如)ADMIN;这意味着@Secured(“ROLE_ADMIN”)的注释。
  2. WebSecurityConfigurerAdapter 必须具有 @EnableGlobalMethodSecurity(securedEnabled = true)
  3. 与大多数与Spring相关的代理一样,请确保类和安全的方法不是最终的。对于 Kotlin 来说,这意味着“打开”每个方法和类。
  4. 当类及其方法是虚拟的(“open”)时,就没有隐含的接口需求。

下面是一个工作 Kotlin 示例的一部分:

@RestController
@RequestMapping("api/v1")

    open class DiagnosticsController {
        @Autowired
        lateinit var systemDao : SystemDao

        @RequestMapping("ping", method = arrayOf(RequestMethod.GET))
        @Secured("ROLE_ADMIN")
        open fun ping(request : HttpServletRequest, response: HttpServletResponse) : String { ... 
    }

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
open class WebSecurityConfig : WebSecurityConfigurerAdapter() {

问候