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

Spring 4 Boot, Security and Android -> POST HttpClientErrorException 403 禁止

巢烨
2023-03-14

下午好,

我在尝试将一些数据发布到部署在Tomcat上的服务器时遇到错误。我认为这是Spring Security问题。

在服务器上,这是我的安全设置:

    try {
          http.authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .antMatchers("/mainMenu/admin/*").access("hasRole('" + ENUM_USER_ROLES.ADMIN.getValue() +"')")
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")   
            .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")          
            .antMatchers(HttpMethod.GET,"/api/mobile/**").authenticated()           
            .antMatchers(HttpMethod.POST,"/api/mobile/**").authenticated()          
//            .antMatchers(HttpMethod.POST, "/api/mobile/**").access("hasRole('COMPANY_MOBILE')")       
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
          http.httpBasic();
        } catch(Exception e) {
            logger.error(e.getMessage());
        }

在控制器中,我有 2 种方法:

@RequestMapping(value = "/api/mobile/test/1", method=RequestMethod.GET, produces={"application/json"})
    public @ResponseBody String populateActivePSwapBasketGET() {                

        return "HELLO get";
    }

       @RequestMapping(value = "/api/mobile/test/2", method=RequestMethod.POST, produces={"application/json"})
        public @ResponseBody String populateActivePSwapBasketPOST() {               

            return "HELLO post";
        }

从android的角度来看,我成功地调用了第一个GET方法,但POST方法抛出了

org.springframework.web.client。HttpClientErrorException:403禁止

在Android手机上,下面是我在服务器上调用Get和Post方法的两种方式。第二个给了我一个例外:

 HttpAuthentication authHeader = new HttpBasicAuthentication(userName, password);
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setAuthorization(authHeader);


        final Gson gson = new Gson();
        // Create the request body as a MultiValueMap
        MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();
    HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);

 RestTemplate restTemplate = new RestTemplate(true);
        try {
            ResponseEntity<String> out1 = restTemplate.exchange(
                    AndroidPhoneProperties.REST_API + "/api/mobile/test/1",
                    HttpMethod.GET,
                    requestEntity,
                    String.class);

            ResponseEntity<String> out2 = restTemplate.exchange(
                    AndroidPhoneProperties.REST_API + "/api/mobile/test/2",
                    HttpMethod.POST,
                    requestEntity,
                    String.class);
            String asd = "";
        } catch (HttpClientErrorException e) {
            CustomAppLogging.e(this.getClass().getName(), CLASSNAME + " HttpClientErrorException " + e.getMessage());
        } 

这是我为服务器准备的gradle文件:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework:spring-jdbc:4.1.0.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("mysql:mysql-connector-java:5.1.+")
    compile("org.webjars:bootstrap:3.0.3")
    compile("org.webjars:jquery:2.0.3-1")
    compile("org.springframework.security.oauth:spring-security-oauth2:2.0.7.RELEASE")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("com.google.code.gson:gson:2.2.4")
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

    testCompile("junit:junit")
}

这是我的Android项目的 Gradle 文件:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
    compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
    compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'
    compile 'com.google.code.gson:gson:2.3'
    compile 'org.springframework.android:spring-android-rest-template:2.0.0.M1'
    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:support-v4:22.1.1'
    compile 'de.hdodenhof:circleimageview:1.3.0'


}

当我测试这个时,我从命令行运行它,如下所示:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar build/libs/xxx-0.1.0.jar

我在哪里可以看到Spring Security性的日志,这些日志可以告诉我更多关于POST被拒绝原因的信息?如果我切换到在我的Tomcat服务器上部署它,我会得到更好的日志吗?

如果您想了解更多信息,请询问。

谢谢你的帮助。

共有1个答案

林烨华
2023-03-14

残疾人CSRF。

@Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                // ...
                .csrf().disable();
        }

答案贴在这里:

spring security 403错误

 类似资料:
  • 请求header POST /v1/activity/{频道id}/comments/{观众id}/mute Authorization:Bearer {ACCESS TOKEN} Content-Type:application/json 注: 请将上方的{ACCESS TOKEN}替换为您的ACCESS TOKEN 请将"{频道id}"替换为您的频道id 请将"{观众id}"替换为您想要禁言

  • 一、功能说明 本功能为设置禁止登陆后台的IP地址,支持通配符 二、子功能导航 1.添加IP 2.管理IP 三、功能详解 1.添加IP 1).如何进入本功能 导航栏 选择扩展 -> 菜单栏 选择IP禁止 2).界面解释 进入后选择添加IP禁止按钮弹出如下界面 界面详述 1). IP: 填写您欲禁止进入后台的IP,支持通配符,如图所示将会阻止:127.0.0.0~127.0.0.255 之间的IP登陆

  • 我对这个被禁止的问题感到困惑。首先,我查看了相关的stackoverflow帖子,并在谷歌上搜索了足够多,但仍然不知道。 项目详细信息: HTML Instagram.php form_open()函数为访问令牌生成隐藏字段,并将其包含在ajax发布数据中。 JavaScript AdminScript.js 控制器 admin.php 当我使csrf保护状态为假时,它们都能正常工作。或者当我将p

  • 我想暂时禁用整个应用程序的Spring Security性,但我总是被403禁止 删除控制器中的@PreAuthorize注释不会给出任何结果。未使用此注释标记的endpoint也会丢弃我 403 禁止 我不需要基本身份验证 我不需要身份验证 我的Spring Security配置:(/,/api/**,/**,**不工作,我总是得到403禁止) 我的一个控制者:

  • 问题内容: 在抓取https://www.netflix.com之类的网站时,被robots.txt禁止:https://www.netflix.com/> 错误:未下载以下响应:https : //www.netflix.com/ 问题答案: 在2016年5月11日发布的新版本(scrapy 1.1)中,抓取功能先在抓取之前下载了robots.txt。要更改此行为,请使用ROBOTSTXT_OB

  • 你好,我对上面的代码有一个问题。我从一个网站上得到的。它返回$缓冲区,服务器理解请求,但被禁止。

  • 这是一个禁用的测试案例: import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @Disabled class DisabledClassDemo { @Test void testWillBeSkipped() { } } 这是一个带有禁用测试方法的测试案例: import

  • Spring我是新来的。我试图在我的数据库中添加一个新目标。在我添加spring security之前,它是有效的,但现在如果我单击添加新目标,我有一个问题: 出现意外错误(类型=禁止,状态=403)。被禁止的 我的goat-add.html: WebSecurity配置类: 我的控制器: 我读到这个问题可以是如果不使用csrf,但我不明白我怎么能解决它。 所有代码:https://github.