java - Spring security , Configuration hasAuthority check on endpoints not working
问题描述
我的 Web 应用程序有弹簧执行器和管理端点。
在我的弹簧安全配置中,我有以下代码:
.and()
.authorizeRequests()
.antMatchers("/actuator/**", "/administration/**")
.hasAuthority(Authority.ADMIN.name())
这似乎不起作用,期望的结果是只有具有 admin 权限的用户才能访问这些端点,现在,任何经过身份验证的用户都可以这样做。我使用具有 USER 权限而不是管理员权限的用户完成了它,它可以工作。
这对我来说太危险了,当当局可以管理时,我不想设置密码保护。
那么如何确保只有具有 ADMIN 权限的用户才能访问以下端点?
我只发布了一小段代码,请告诉我是否需要其他任何内容以便您能够提供帮助:)。
是的,我已经对此进行了调试,并且我的流程中的权限设置正确,admin 具有 auth admin 并且它适用于基本 auth 和 oauth2。有谁知道会发生什么?
目前只有完全未登录的人无法访问这些端点,这是我的完整安全配置:
// @formatter:off
httpSecurity
.authorizeRequests()
.antMatchers(
Utils.MAPPING_INDEX,
Utils.MAPPING_ARTICLE,
Utils.MAPPING_IMAGE,
Utils.MAPPING_ERROR,
Utils.MAPPING_VERIFY_MAIL,
Utils.MAPPING_REGISTER,
Utils.MAPPING_LOGIN,
Utils.MAPPING_LOGIN_ERROR,
Utils.MAPPING_LOGIN_VERIFIED,
Utils.MAPPING_LOGIN_VERIFICATION_ERROR,
Utils.MAPPING_RESET_PASSWORD,
Utils.MAPPING_LOGIN_PASSWORD_RESET_SUCCESS,
Utils.MAPPING_LOGIN_PASSWORD_RESET_LOCKED,
Utils.MAPPING_RESET_PASSWORD_RESET_MAIL_SEND,
Utils.MAPPING_LOGIN_PASSWORD_RESET_FAILURE,
Utils.MAPPING_INDEX_LOGOUT_SUCCESS,
Utils.MAPPING_REGISTER_SUCCESS,
Utils.MAPPING_REGISTER,
Utils.MAPPING_RESET_PASSWORD,
Utils.MAPPING_RESET_PASSWORD_NEW_PASSWORD,
Utils.MAPPING_AUTHOR,
Utils.MAPPING_CONTACT,
Utils.MAPPING_CONTACT_SUCCESS,
Utils.MAPPING_CONTACT_FAILURE,
Utils.MAPPING_REPORT_WORKAROUND,
"/test",
"/test1",
"/frag1",
"/frag2",
"/css/**",
"/js/**",
"/img/**",
"/fonts/**",
"/external/**",
"/favicon.ico",
"/favicon_32.ico",
"/favicon.svg"
).permitAll()
.anyRequest().authenticated()
.and()
.authorizeRequests()
.antMatchers("/actuator/**", "/administration/**")
.hasAuthority(Authority.ADMIN.name())
.and()
.formLogin()
.loginPage(Utils.MAPPING_LOGIN)
.loginProcessingUrl(Utils.MAPPING_LOGIN)
.usernameParameter("email")
.passwordParameter("password")
.successHandler(basicAuthenticationSuccessHandlerImpl)
.failureUrl(Utils.MAPPING_LOGIN_ERROR)
.and()
.logout()
.logoutUrl(Utils.MAPPING_INDEX)
.logoutSuccessUrl(Utils.MAPPING_INDEX_LOGOUT_SUCCESS)
.invalidateHttpSession(true)
.and()
.oauth2Login()
.loginPage(Utils.MAPPING_LOGIN)
.successHandler(oauth2AuthenticationSuccessHandler);
// @formatter:on
}
解决方案
这个问题在评论中得到了回答,不幸的是评论者没有发布答案,所以我这样做了。所有功劳归功于 M. Deinum。
正确的解决方法是移动
.anyRequest().authenticated()
进入 httpsecurity 配置的最后一个位置。在这种情况下订购很重要。
推荐阅读
- java - 是否可以使用 Java 注释更改方法可见性?
- python - 如何用新行扩展 Excel 单元格?
- c# - 如何扩展继承的方法而不是覆盖它?
- python-3.x - 在 tkinter (python3.7) 中禁用撤消按钮
- java - java中的长字符串连接问题?
- python - 从 Python Facebook SDK 上的 AdsInsights 获取所有字段
- angular - 使用以角度扩展原生 html 元素的 Web 组件的问题
- android - Kotlin:伴随对象lateinit vars是否初始化一次?
- html - HTML 电子邮件签名问题
- reactjs - 如何在 React Compoenent 之外调度操作