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

Spring Security---授权操作详解

jdbcAuthentication() 而不是 inMemoryAuthentication() 不提供访问权限 - Spring Security 和 Spring Data JPA

Spring Security - permitAll() 不允许未经身份验证的访问

不登录就无法访问静态资源目录(我使用的是spring security)