在 v2.0.X 中无法使用 Spring Cloud + boot 调用 /encrypt 端点

Posted

技术标签:

【中文标题】在 v2.0.X 中无法使用 Spring Cloud + boot 调用 /encrypt 端点【英文标题】:Unable to call the /encrypt endpoint with Spring Cloud + boot in v2.0.X 【发布时间】:2019-02-07 05:52:28 【问题描述】:

我使用的是 Spring Cloud and Security 示例。在这个例子中,我使用的是 Spring Boot 版本1.4.1.RELEASE。 Spring Boot 父版本为2.0.4.RELASE。在我更新端点之后的依赖项的那一刻开始中断。

我已经查看了Spring Cloud Config - Encrypt Password 和文档http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html,但不知道为什么会出现 forbiddeb 错误。

我尝试使用 CURL 和 POSTMAN,得到了禁止的错误。

C:\Users\pc>curl localhost:8888/encrypt -d connectionstring=server123;user=root;password@word1 "timestamp":"2018-09-01T12:53:17.382+0000","status":403,"error":"Forbidden","message":"Forbidden","path":"/encrypt" C:\用户\pc>

注意:我的服务器在 8888 端口上运行正常,并且已添加 JCE 文件

发帖:http://localhost:8888/encrypt

我在下面使用的代码

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>$spring-cloud.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

application.yml

---

server:
  port: 8888


spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/rseroter/pluralsight-spring-cloudconfig-wa-tolls

          search-paths:
          - 'station*'
          repos:
            perf: 
              pattern:
              - "*/perf"
              uri : https://github.com/rseroter/pluralsight-spring-cloudconfig-wa-tolls-perf
              search-paths :
              - 'station*'

# Enable security for Basic Auth
  security:
    user:
      name: ABC_123
      password: ABC##123

bootstrap.properties

encrypt.key=ABCDEFGHIJKLMNOPQRSTUVWXYZ

WebSecurityConfig.java

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
    @Override
    protected void configure(HttpSecurity http) throws Exception
        http.authorizeRequests().antMatchers("/").permitAll();
    

项目结构:

【问题讨论】:

【参考方案1】:

问题是Spring Security默认开启了csrf保护。您可以阅读here 了解更多信息。

只需禁用 csrf 保护将有助于 /encrypt 再次访问。

http.csrf().disable()
            .authorizeRequests().mvcMatchers(HttpMethod.POST, "/encrypt/**")
            .permitAll();

【讨论】:

【参考方案2】:

thanh ngo 答案对我有用,但做了一些修改。

首先,如果您在 Spring Boot 上尝试此操作,mvcMatcher 可能无法正常工作。如果你只是在练习,你可以简单地使用

http.authorizeRequests().anyRequest().permitAll().and().csrf().disable();

整个班级看起来像

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
       
        http.authorizeRequests().anyRequest().permitAll().and().csrf().disable();
    

【讨论】:

以上是关于在 v2.0.X 中无法使用 Spring Cloud + boot 调用 /encrypt 端点的主要内容,如果未能解决你的问题,请参考以下文章

小知识:SpringCloudConfigServer从git获取配置信息报错:.c.s.e.MultipleJGitEnvironmentRepository : Error occured clo

将 Sencha Architect 项目从 Sencha Touch v2.0.x 更新到 Sencha Touch 2.1.x

Spring Cloud(15)——配置中心

druid使用记录

Spring+Mybatis类型转换的问题,oracle数据库中有一个clob类型,怎样在查询以后转换为String类型?

无法创建 Windows 虚拟机