当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器

Posted

技术标签:

【中文标题】当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器【英文标题】:Which annotation shall I use to keep spring boot from securing my Controller when actuator is active 【发布时间】:2015-03-14 22:09:41 【问题描述】:

我编写了一个简单的 Spring Boot 应用程序(版本为 1.21),它通过 REST 公开数据。我激活了执行器以了解应用程序中发生的情况:

dependencies 
    compile("org.springframework.boot:spring-boot-starter-actuator")

在我的开发环境中,我设置了一个固定的用户/密码:

security.user.name=admin
security.user.password=admin
security.user.role=ADMIN

Actuator 导致 Spring Security 被激活,这也保护了我的 Controller。这不是我想要的,我希望调用它而不需要进行身份验证。当我调用控制器时,我在日志中看到这条消息:

11:00:40.713 [http-nio-8080-exec-1] INFO  o.s.b.a.audit.listener.AuditListener - AuditEvent [timestamp=Fri Jan 16 11:00:40 CET 2015, principal=anonymousUser, type=AUTHORIZATION_FAILURE, data=type=org.springframework.security.access.AccessDeniedExcep
tion, message=access denied]

我在 *** 上阅读了此 article,但无法将其转换为注释。我试图用@Secured("ROLE_ANONYMOUS")@Secured("IS_AUTHENTICATED_ANONYMOUSLY") 注释我的控制器,但这没有成功。我认为这会导致 Spring Security 仍在尝试对用户进行身份验证,但之后他所在的角色就无关紧要了

是否有我可以为我的控制器定义的注释来指示 Spring Security 避免弹出身份验证框?

首先我尝试在不添加 Spring Security 的情况下相处,但是当 jar 丢失时,我收到以下消息:

13:27:08.726 [main] ERROR o.s.boot.SpringApplication - Application startup failed
java.lang.IllegalStateException: Could not evaluate condition on org.springframework.boot.autoconfigure.security.SpringBootWebSecurityConfiguration#ignoredPathsWebSecurityConfigurerAdapter due to internal class not found. This can happen if you are @
ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:51) ~[spring-boot-autoconfigure-1.2.1.RELEASE.jar:1.2.1.RELEASE]
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102) ~[spring-context-4.1.4.RELEASE.jar:4.1.4.RELEASE]
...
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) [spring-boot-1.2.1.RELEASE.jar:1.2.1.RELEASE]
    at demo.Application.main(Application.java:20) [bin/:na]
Caused by: java.lang.NoClassDefFoundError: org/springframework/security/web/access/WebInvocationPrivilegeEvaluator

Application.java:20 看起来像这样:

ApplicationContext ctx = SpringApplication.run(Application.class, args);

【问题讨论】:

你试过security.basic.enabled=false吗? security.basic.enabled=false(如果您什么都不做)将禁用执行器未提供的端点上的安全性。我猜你尝试添加自己的过滤器打破了这一点? 您确实定义了至少一个过滤器(因为您启用了安全性)。您粘贴的日志行表明用户在访问您的端点时是匿名的,这意味着它被安全过滤器拦截(如果您只是坚持使用 vanilla Spring Boot 配置就不会这样)。 有一个过滤器是一个bean(包含许多具有不同匹配规则的过滤器链)。打开 org.springframework.security 的 DEBUG 日志记录可以为您提供很多有关如何做出访问决策的有用信息。 您也可以删除 spring security 并遵循您发布的堆栈跟踪中的建议(不要使用默认包)。 【参考方案1】:

感谢 Dave Syer 的专业知识,我能够解决这个问题。 我在application.properties 中设置了security.basic.enabled=false,并从我的build.gradle 文件中删除了spring security。

几天前我已经这样做了,但显然刷新项目并没有工作,所以弹簧安全罐子留在类路径上而我没有注意到这一点。完全重建项目后,一切正常。

【讨论】:

【参考方案2】:

你可以声明

@Bean AuthenticationManager authenticationManager(AuthenticationManagerBuilder auth) 
        return auth.getOrBuild();
    

前提是你已经配置了“AuthenticationManagerBuilder”

【讨论】:

以上是关于当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器的主要内容,如果未能解决你的问题,请参考以下文章

当特定的弹簧配置文件处于活动状态时,如何防止运行测试?

当设备的(android)键盘处于活动状态时,jquery 移动弹出窗口小部件不会移动

Swift 防止 TabBar 在键盘处于活动状态时向上移动

当应用程序进入前台时,哪个View Controller处于活动状态?

iOS 如何知道哪个视图控制器应该处于活动状态?

当 UIPopoverController 处于活动状态时,UIWebView 未检测到点击