Spring Security - 不访问数据库
Posted
技术标签:
【中文标题】Spring Security - 不访问数据库【英文标题】:Spring Security - doesn't access database 【发布时间】:2017-11-04 03:35:28 【问题描述】:我正在使用 Spring Boot 并且对 Spring Security 非常陌生,但我希望我的 Web 应用程序具有基本的安全性。我所做的是在我的 pom.xml 中添加所需的依赖项并将这个 java 类添加到我的项目中:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
@Override
protected void configure(HttpSecurity http) throws Exception
http.authorizeRequests()
.antMatchers("/**","/event/**","/ticket/**")
.hasRole("USER")
.and()
.formLogin();
运行我的 Web 应用程序后,我进入了登录页面,我在其中输入了用户/密码,然后它进入了我的 Web 应用程序。但是,这些命令不起作用。我正在按下一些应该向我的 mysql 数据库发送信号的按钮,但没有任何反应。就像前端不再连接到后端一样。我将 AngularJS 用于前端和在页面之间导航的视图控制器。应用程序的其余部分是基于 REST 的。知道为什么会发生这种情况吗?
稍后编辑:现在我明白了,我遇到的问题是,在进行身份验证后,我的端点上出现了 403 状态代码。知道如何解决吗?
后来的 Editv2:看起来我的 POST 请求没有获得授权,我的 GET 工作正常……这是我的一些 POST 端点: /event/buy_ticket/id , /ticket// cancel_ticket/id
angular.min.js:101 POST http://localhost:8080/event/buy_ticket/2 403 ()
我什至试图明确地说它允许它,但我仍然得到 403...
http.authorizeRequests()
.antMatchers("/**","/event/**","/ticket/**","/event/buy_ticket/2")
.permitAll()
.and()
.formLogin();
稍后稍后编辑:
禁用 csrf 有效
【问题讨论】:
不,身份验证有效。问题来了,当我在我的页面上做事时没有任何反应 您是否从您的 api 端点收到 403 响应? 是的,我得到 403 【参考方案1】:获取 403 Forbidden 错误代码意味着 Spring 正在接收您的请求,但选择停止处理它们。来自HTTP 403 上的 Wiki 页面:
提供了身份验证,但未通过身份验证的用户 允许执行请求的操作。
如果我不得不下注,我会说问题是您没有指定应该访问哪些资源和端点以及如何访问。如果我没记错的话,默认情况下,Spring Security 会超级紧密地锁定所有内容,因此您需要明确告诉它要打开什么。以下是我自己的安全配置示例:
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests() // require authorization
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll() // for the CORS preflight check
.antMatchers("/login", "/api/open/**", "/resources/**").permitAll() // the open API endpoints and resources
.antMatchers("/logout", "/api/secured/**").authenticated(); // lock down these endpoints
...additional configurations...
所有应该免费使用的端点都以"/api/open/"
开头,而所有应该受Spring Security保护的端点都以"/api/secured/"
开头。例外是注销和登录端点,因为它们直接绑定到 Spring Security。
这里有一个很棒的 blog post - 和相关的 repo - 展示了如何实现与 AngularJS 配合得很好的 Spring Security,即使是作为一个单页应用程序,这是出了名的令人讨厌的安全性。
编辑:您可能会遇到 CSRF 保护,该保护在 Spring Security 中默认启用 - 请参阅此 post。 CSRF 将允许 HTTP“安全”方法,如 GET、HEAD 和 OPTION,但如果这些方法没有提供正确的令牌,则阻止“不安全”方法,如 PUT、POST、DELETE 等(因为没有配置 CSRF,这些请求不会有一个令牌 -> 被阻止)。出于测试目的,您可以通过将http.csrf().disable()
添加到configure()
方法来禁用它。
【讨论】:
是的,它是 csrf。非常感谢:)以上是关于Spring Security - 不访问数据库的主要内容,如果未能解决你的问题,请参考以下文章
用于非授权连接的 Spring Security REST Api
spring security3.1升级到4.1问题访问/j_spring_security_check 404
jdbcAuthentication() 而不是 inMemoryAuthentication() 不提供访问权限 - Spring Security 和 Spring Data JPA