当前位置: 首页 > 知识库问答 >
问题:

Spring bootSpring安全选项呼叫403

隆扬
2023-03-14

我正在使用Spring Boot 2. x Spring Security JWT为我的Angular 5应用程序创建REST API。

我可以使用POSTMAN登录,但从Angular应用程序中,我的选项调用失败:

Request URL: http://localhost:8080/api/v1/login
Request Method: OPTIONS
Status Code: 403 
Remote Address: [::1]:8080

安全配置。Java语言

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
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.builders.WebSecurity;
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 SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    private DataSource dataSource;

    @Value("${spring.queries.users-query}")
    private String usersQuery;

    @Value("${spring.queries.roles-query}")
    private String rolesQuery;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().usersByUsernameQuery(usersQuery).authoritiesByUsernameQuery(rolesQuery).dataSource(dataSource)
                .passwordEncoder(bCryptPasswordEncoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().disable().csrf().disable().authorizeRequests().antMatchers("/").permitAll().antMatchers("/").permitAll();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**");
    }
}

应用属性

# ===============================
# = DATA SOURCE
# ===============================
spring.datasource.url=jdbc:mysql://localhost:3306/some_db

spring.datasource.username=some_user
spring.datasource.password=some_password
spring.datasource.driverClassName=com.mysql.jdbc.Driver

# ===============================
# = JPA / HIBERNATE SETTINGS
# ===============================

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto = validate

# =============================================================
# = Spring Security / Queries for AuthenticationManagerBuilder  
# =============================================================

spring.queries.users-query=select email, password from users where email=?
spring.queries.roles-query=select u.email, r.role from users u inner join user_role ur on(u.user_id=ur.user_id) inner join role r on(ur.role_id=r.role_id) where u.email=? 

# ===========================
# = JSON WEB TOKEN SETTINGS  
# ===========================

jwt.secret= JWTSuperSecretKey
jwt.expiration = 604800000

邮差:

职位:http://localhost:8080/api/v1/login

内容类型:应用程序/x-www-form-urlencoded

从角度看,这是头球问题吗?

共有1个答案

严修谨
2023-03-14

您禁用了CORS,这意味着您的服务器将不会告诉前端允许对任何来源的请求,而只允许其自身。通过告诉服务器接受来自另一个来源的请求,例如,localhost:4200,以及GET、PUT、POST、DELETE和OPTIONS方法,应用程序应该可以工作。

下面的设置比它需要的要复杂一点,但是它把东西很好和整洁分开了。

允许来源的定义应放在application.yml例如。

cors:
  allowed-origins:
    - https://localhost:4200
    - http://localhost:4200
    - http://127.0.0.1:4200
    - https://127.0.0.1:4200

然后您添加两个文件,一个用于加载配置...

@Configuration
@ConfigurationProperties("cors")
public class CorsConfig {
    private List<String> allowedOrigins = new ArrayList<>();
    private String[] allowedMethods = {
        HttpMethod.GET.name(),
        HttpMethod.HEAD.name(),
        HttpMethod.POST.name(),
        HttpMethod.PUT.name(),
        HttpMethod.DELETE.name()
    };

    public List<String> getAllowedOrigins() {
        return allowedOrigins;
    }

    public String[] getAllowedOriginsArray() {
        return getAllowedOrigins().toArray(new String[0]);
    }

    public String[] getAllowedMethods() {
        return allowedMethods;
    }
}

... 还有一个让它发挥作用。

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
    private final CorsConfig corsConfig;

    public WebMvcConfig(CorsConfig corsConfig) {
    this.corsConfig = corsConfig;
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins(corsConfig.getAllowedOriginsArray())
            .allowedMethods(corsConfig.getAllowedMethods());
    }
}
 类似资料:
  • 问题内容: 如果用户查看我的JavaScript文件,复制函数的内容并使用AJAX向我的服务器发送请求,会发生什么情况?有没有办法适当地防止这种情况的发生? 问题答案: 防止这种情况发生的方法与针对 任何 Web请求采取的保护方法没有什么不同。您这样做是为了使您的站点需要某种形式的身份验证(即用户必须登录),并且如果请求未正确身份验证,则不要执行任何操作。 通常,当您发出AJAX请求时,cooki

  • 安全特性 安全特性 访问日志和审计 访问日志和审计

  • 客户端和服务器间的通信加密 Seafile 在服务器配置了 HTTPS 后,客户端会自动使用 HTTPS 协议和服务器通信。 加密资料库如何工作? 当你创建一个加密资料库,你将为其提供一个密码。所有资料库中的数据在上传到服务器之前都将用密码进行加密。 加密流程: 生成一个32字节长的加密的强随机数。它将被用作文件加密秘钥(“文件秘钥”)。 用用户提供的密码对文件秘钥进行加密 (使用PBKDF2算法

  • 我在调用我的onLeScan时遇到问题。我在开始扫描中放置了一个标签,每次都会被调用。出于某种原因,我的onLeScan永远不会被调用。有人看到我所做的有问题吗?onLeScan应该在开始扫描后立即调用,对吗? 编辑更改了我的onLeScan函数。仍然不起作用,但我认为我正在走向正确的道路。DeviceBeacon是一个只包含方法的类:getName()、getSignal()和getAddres

  • 1、接口声明 如果您希望在自己的CRM系统嵌入呼叫中心能力,需要对接智齿呼叫中心能力,在对接前请您阅读如下对接流程,以便您更好的完成对接。如果只对接基本呼叫能力,预计对接及调试过程1周左右即可完成。 第一步:获取第三方用户接口调用唯一凭证 请联系您的售后经理,获取您企业的如下信息: 1、companyid(企业id) 2、appid(第三方用户接口调用唯一凭证id) 3、app_key(第三方用户

  • 我是RXJava的新手。在一个场景中,我希望调用第一个登录webservice(),如果成功,则希望调用另一个webservice()以获取用户信息。