Spring Security:无法在前端进行身份验证

Posted

技术标签:

【中文标题】Spring Security:无法在前端进行身份验证【英文标题】:Spring Security : impossible to do Authentication in front end side 【发布时间】:2019-06-14 00:50:05 【问题描述】:

我有一个 Spring Boot 后端和一个基于 Angular 5 的前端。 我想使用 Spring Security 进行身份验证和授权。 我希望在 Angular(http://localhost:4200/login) 中自定义登录表单。 我想在数据库中有用户及其密码和角色。 我不明白如何告诉 Spring 登录页面位于不同的域中(在前端)。 我应该在 RestController 类中定义一个 /login 还是在 Spring Security 中默认有一个 /login 允许对用户进行身份验证? 请帮忙。

我从测试配置开始:内存中的用户:

package smart.syndic.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
   

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
       
        auth.inMemoryAuthentication()
            .withUser("admin").password("1234")
            .roles("ADMIN");
    

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder()
    
        return new BCryptPasswordEncoder();
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
    
        http.csrf().disable();
        http.authorizeRequests()
            .antMatchers("/login/**", "/administrateurs/**").permitAll()
            .and()
            .authorizeRequests().antMatchers(HttpMethod.GET, "/users").permitAll()
            .and()
            .exceptionHandling().accessDeniedPage("/forbidden")
            .and()
            .authorizeRequests().anyRequest().authenticated();

    

【问题讨论】:

看看这个:github.com/bfwg/springboot-jwt-starter 【参考方案1】:

如果您选择将后端和前端拆分到 2 个不同的服务器(例如 localhost:8080 和 localhost:4200),那么假设后端对前端一无所知会更优雅。在这种方法中,当请求未经授权时,后端应返回状态 401 (like here),您的前端应处理此问题,将用户重定向到 /login 页面。

为了在春天做到这一点,你可以像评论中的例子那样做。

    实施filter 告诉 spring 使用这个过滤器,就像这里 WebSecurityConfig Create controller for login

【讨论】:

以上是关于Spring Security:无法在前端进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

通过使用 AngularJS 的自定义登录进行 Spring Security 身份验证

使用用户组和角色时 Grails / Spring Security 中的错误 - 无法进行身份验证

使用 Spring Security 3 进行 LDAP 身份验证

通过 Active Directory LDAP 使用 Spring-Security 进行身份验证

如何将凭据从 Angular 前端传递到 Spring 后端(Spring Security 的基本身份验证)

如何在 Spring Security 5 中进行未经身份验证的授权