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

时间:2019-01-20 12:09:30

标签: java angular spring-boot spring-security

我有一个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();

    }
}

1 个答案:

答案 0 :(得分:0)

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

为了在春季执行此操作,您可以像在注释示例中一样进行操作。

  1. 实施filter
  2. 告诉弹簧像这里WebSecurityConfig一样使用此过滤器
  3. Create controller for login