当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器
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】:
你可以声明
@Bean AuthenticationManager authenticationManager(AuthenticationManagerBuilder auth)
return auth.getOrBuild();
前提是你已经配置了“AuthenticationManagerBuilder”
【讨论】:
【参考方案2】:感谢 Dave Syer 的专业知识,我能够解决这个问题。
我在application.properties
中设置了security.basic.enabled=false
,并从我的build.gradle
文件中删除了spring security。
几天前我已经这样做了,但显然刷新项目并没有工作,所以弹簧安全罐子留在类路径上而我没有注意到这一点。完全重建项目后,一切正常。
【讨论】:
以上是关于当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器的主要内容,如果未能解决你的问题,请参考以下文章
当设备的(android)键盘处于活动状态时,jquery 移动弹出窗口小部件不会移动
Swift 防止 TabBar 在键盘处于活动状态时向上移动