Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Springboot身份验证问题_Spring Boot_Spring Security - Fatal编程技术网

Spring boot Springboot身份验证问题

Spring boot Springboot身份验证问题,spring-boot,spring-security,Spring Boot,Spring Security,我有一个配置了spring安全性的spring引导应用程序。我已将登录请求重定向到http://localhost:8000 我在python服务器上运行我的前端。现在,当我尝试将登录发布到我的springboot应用程序时,它不起作用。即使我从邮递员那里试过,上面也写着405错误。我怎样才能让它工作呢。如果我将它作为html放在同一个项目中,但不是从python服务器或邮递员处,那么它可以从/login开始工作。有什么区别 消息:不支持请求方法“POST”, 路径:/login 表单数据 &l

我有一个配置了spring安全性的spring引导应用程序。我已将登录请求重定向到http://localhost:8000 我在python服务器上运行我的前端。现在,当我尝试将登录发布到我的springboot应用程序时,它不起作用。即使我从邮递员那里试过,上面也写着405错误。我怎样才能让它工作呢。如果我将它作为html放在同一个项目中,但不是从python服务器或邮递员处,那么它可以从/login开始工作。有什么区别

消息:不支持请求方法“POST”, 路径:/login

表单数据

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>

    <title>Demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


</head>
<body>


<!-- Add page specific code/html START -->

<div class="container">
    <h1 th:text="#{welcome.message}"></h1>

    <form class="form-signin" name="loginForm" th:action="@{/login}" action="/login" method="POST">
        <h2 class="form-signin-heading">Please sign in</h2>
        <label for="username" class="sr-only">Email address</label>
        <input type="text" name="username" id="username" class="form-control" placeholder="Username" required="required" autofocus="autofocus" />
        <label for="password" class="sr-only">Password</label>
        <input type="password" name="password" id="password" class="form-control" placeholder="Password" required="required" />

        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </form>

</div> <!-- /container -->


</body>
</html>
安全配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${ldap.urls}")
    private String ldapUrls;

    @Value("${ldap.base.dn}")
    private String ldapBaseDn;

    @Value("${ldap.user.dn.pattern}")
    private String ldapUserDnPattern;

    @Value("${ldap.enabled}")
    private String ldapEnabled;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/login**").permitAll()
                .antMatchers("/assessments/**").fullyAuthenticated()
                .antMatchers("/").permitAll()
                .and()
                .formLogin()
                //.loginPage("http://htmlcode.s3-website.us-east-2.amazonaws.com")
                .loginPage("http://localhost:8000")
                .loginProcessingUrl("/j_spring_security_check")
                .usernameParameter("j_username")
                .passwordParameter("j_password")
                //.loginPage("/login")
                .failureUrl("/login?error")
                .permitAll()
                .and()
                .logout()
                .invalidateHttpSession(true)
                .deleteCookies("JSESSIONID")
                .permitAll();

    }



    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/register");
        // .antMatchers("/assessments/**");
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        if(Boolean.parseBoolean(ldapEnabled)) {
            auth.ldapAuthentication()
                    .userDetailsContextMapper(userDetailsContextMapper())
                    .userDnPatterns(ldapUserDnPattern)
                    .contextSource()
                    .url(ldapUrls+ldapBaseDn);
        }
    }

    @Bean
    public UserDetailsContextMapper userDetailsContextMapper() {
        return new LdapUserDetailsMapper() {
            @Override
            public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) {
                UserDetails details = super.mapUserFromContext(ctx, username, authorities);
                return details;
            }
        };
    }

    @Bean
    CorsFilter corsFilter() {
        CorsFilter filter = new CorsFilter();
        return filter;
    }
}

您忘记了包含csrf值。这是一种防止跨站点攻击的安全预防机制。您的解决方案有两个选项:

1.禁用CSRF: 由于默认情况下启用了csrf,因此启用csrf时不允许使用POST和PUT Http方法。 要禁用它,应将其添加到安全配置中

.csrf().disable()
例如,你可以有这样的东西:

http.
.csrf().disable().
authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .and()
          .formLogin().loginPage("/login").failureUrl("/login?error")
          .usernameParameter("username").passwordParameter("password")
        .and()
          .logout().logoutSuccessUrl("/login?logout")
        .and()
          .exceptionHandling().accessDeniedPage("/403");
2.发送csrf令牌值:

如果您将登录页面与登录表单一起使用,我们需要始终将CSRF令牌作为隐藏参数手动包含在登录表单的代码中:

<input
  type="hidden"
  th:name="${_csrf.parameterName}"
  th:value="${_csrf.token}" />
更多信息
我已经完成了csrf禁用。我们是否仍应包括第2步中提到的csrftoken?您是否可以包括您的安全配置代码,以便我可以更好地指导您?编辑了我的问题。请检查您的浏览器是否禁用了Cookie,如果是,请启用它并重新检查您的意思是405错误消失了?我看不到您的successHandlerauthenticationsuccessHandler?您需要在某个地方定义用户是否经过身份验证
http.
.csrf().disable().
authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .and()
          .formLogin().loginPage("/login").failureUrl("/login?error")
          .usernameParameter("username").passwordParameter("password")
        .and()
          .logout().logoutSuccessUrl("/login?logout")
        .and()
          .exceptionHandling().accessDeniedPage("/403");
<input
  type="hidden"
  th:name="${_csrf.parameterName}"
  th:value="${_csrf.token}" />
<script type="text/javascript">
    var csrfParameter = '${_csrf.parameterName}';
    var csrfToken = '${_csrf.token}';
</script>
var jsonParams = {};
jsonParams['parentId'] = 1;
jsonParams[csrfParameter] = csrfToken;
// include other values pass ,user, etc.

$.ajax({
    type: 'POST',
    cache: false,
    url: /login,
    data: jsonParams,
    dataType = 'json',
    contentType = 'application/json',

    ...
});