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

spring安全+Angular一个401错误怎么处理?

子车新立
2023-03-14

我正在学习如何使用spring安全和angular进行登录验证的教程,但每当我运行angular程序并尝试登录时,我会得到一个401错误。我觉得这是一个cors问题,创建了一个cors过滤器类,这是一个类似问题的解决方案,但我仍然得到相同的错误。登录详细信息是正确的,因为我使用相同的凭据登录到localhost:8080,用于后端,但当我尝试使用前端登录时,在索引中出现以下错误。

错误:

请求URL:http://localhost:8080/login

请求方法:GET

状态代码:401

远程地址:[::1]:8080

推荐人策略:降级时不推荐人

access-control-allow-headers:access_token、authorization、content-t

access-control-allow-methods:POST,PUT,GET,OPTIONS,

Access-Control-Allow-Origine:*

Access-Control-Max-Age:4200

cache-control:no-cache,no-store,max-age=0,must-revalidate

连接:keep-alive

内容-长度:0

日期:2020年7月28日星期二07:47:34 GMT

过期:0

keep-alive:timeout=60

pragma:无缓存

变化:原点

变:Access-Control-Request-Method

变:Access-Control-Request-Headers

www-authenticate:Basic realm=“realm”

www-authenticate:Basic realm=“realm”

X-content-type-options:nosniff

X-Frame-Options:拒绝

X-XSS-保护:1;模式=块

Accept:application/json、text/plain、/

接受编码:gzip,deflate,br

接受语言:en-GB,EN-US;q=0.9,EN;q=0.8

授权:Basiccml6YW5hOmp0MTQz

连接:keep-alive

主机:本地主机:8080

来源:http://localhost:4200

引用人:http://localhost:4200/login

sec-fetch-dest:空

SEC-FETCH-MODE:cors

sec-fetch-site:same-site

用户代理:Mozilla/5.0(Linux;Android 6.0;Nexus 5 Build/MRA58N)

AppleWebKit/537.36(KHTML,like Gecko)Chrome/84.0.4147.89 Mobile Safari/537.36

我试过:

Angular 2 spring boot登录CORS问题

教程:

https://www.youtube.com/watch?v=qv7ke4a7lvc

spring安全配置

@Configuration
public class SpringConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    private CORSFilter myCorsFilter;


//CORS


    @Override
    protected void configure(HttpSecurity http) throws Exception {
     /*   http.cors().and().csrf().
                disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**")
                .permitAll()
                .anyRequest()
                .fullyAuthenticated()
                .and()
                .httpBasic();*/

        http.addFilterBefore(myCorsFilter, ChannelProcessingFilter .class);


        http.cors();
        http.csrf().disable();
        http.authorizeRequests().antMatchers("/**").fullyAuthenticated().and()
                .httpBasic();
    }



    protected void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.inMemoryAuthentication()
                .withUser("java")
                .password("{noop}jt143").roles("USER");


    }
}


Corsfilter类


@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter {

    /**
     * CORS filter for http-request and response
     */
    public CORSFilter() {
    }

    /**
     * Do Filter on every http-request.
     */

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "4200");
        response.setHeader("Access-Control-Allow-Headers", "access_token, authorization, content-type");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    /**
     * Destroy method
     */
    @Override
    public void destroy() {
    }

    /**
     * Initialize CORS filter
     */
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

@RestController
@CrossOrigin(origins = "*")
public class CashierController {



        @Autowired
        private CashierRepo repository;

        @GetMapping("/login")
        public String login(){
            return "authenticated";
        }


        @PostMapping("/addUser")
        public String saveCashier(@RequestBody Cashier cashier) {
            repository.save(cashier);
            return "Added user with user id : " + cashier.getUserId();

        }

共有1个答案

国高杰
2023-03-14

似乎您没有将您的登录API排除在spring安全之外。无论何时,我们启用spring安全性,我们都必须配置不应为其施加安全性的URL列表。示例-登录api、html文件、js文件等。您可以通过将下面的方法添加到SpringConfig类中来完成此操作

@Override
    public void configure(WebSecurity web) throws Exception 
    {
        // Allow Login API to be accessed without authentication
        web.ignoring().antMatchers("/login").antMatchers(HttpMethod.OPTIONS, "/**"); // Request type options should be allowed.
    }
 类似资料:
  • 问题如下。我通过Keycloak承载spring安全实现了这样的登录 公共类KeycloakSecurityConfiguration扩展KeycloakWebSecurityConfigurerAdapter{ } ,当我发送授权请求标头为空时,keycloak抛出错误401。我无法通过@ExceptionHandler这样捕捉到: @ExceptionHandler(RuntimeExcept

  • 问题内容: 我正在使用ResponseEntityExceptionHandler全局处理错误,并且几乎可以正常工作,只是我想用spring处理错误的请求。通过任何逻辑,handleNoSuchRequestHandlingMethod都应处理此问题,但是总是要进行处理 HTTP Status 404 - type Status report message description The req

  • 问题内容: 我正在尝试按照网络上的指南使用Spring安全性来保护我的网站。所以在我的服务器端,WebSecurityConfigurerAdapter和控制器看起来像这样 让我非常困惑的是,服务器不响应POST / DELETE方法,而GET方法可以正常工作。顺便说一句,我在客户端上使用RestTemplate。例外情况是: 我已经在互联网上搜索了几天。还是没有头绪。请帮忙。非常感谢 问题答案:

  • 我已经从http://hayageek.com/login-with-google-plus-javascript-api/ 我已经使用我的client_id,api密钥实现了代码,并且还遵循了Google oauth2中invalid_client的说明,但仍然收到相同的错误。 也在OAuth同意屏幕中并提及产品名称和电子邮件地址 错误:无效_client 应用程序:Project_Name 您

  • 前端项目安全问题: 安全部门不知道用什么工具扫了下前端代码,说有高危代码,代码如下: 片段一: const e = ev || window.event const { data } = e 被标记的是 data,安全提示是:第 214 行中发生了不安全对象分配。在没有验证的情况下分配外部属性可能会导致对象属性污染并影响应用程序的正常行为。 片段二: const url = window.loca

  • 这个 pgsql 报 syntax error as or "execption" 是为什么 ? 正确应该怎么写