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

在自定义登录页面中输入用户名和密码时,出现Spring Oauth2错误“在请求参数中未找到令牌”

谭昕
2023-03-14

我已经在spring boot和spring-security-oauth2中创建了自定义登录页面。输入用户名和密码时,出现如下错误

o. s. s. o. p. a. BearerTokenExtractor:在标头中找不到令牌。正在尝试请求参数。o. s. s. o. p. a. BearerTokenExtractor:在请求参数中找不到令牌。不是一个OAuth2请求。p.a.OAuth2Auth

如何传递令牌作为标头参数任何线索?

 @Configuration
    @EnableWebSecurity
    @Import(Encoders.class)
    public class ServerSecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired
        private UserDetailsService userDetailsService;

        @Autowired
        private PasswordEncoder userPasswordEncoder;

        @Override
        @Bean
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService).passwordEncoder(userPasswordEncoder);
        }

        @Override
        @Order(Ordered.HIGHEST_PRECEDENCE)
        protected void configure(HttpSecurity http) throws Exception {
            http
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/about").permitAll() 
            .antMatchers("/oauth/token").permitAll()
            .and()
            .httpBasic()
            .and()
            .formLogin()
            .loginPage("/login")
            .loginProcessingUrl("/loginSecure")
            .defaultSuccessUrl("/index", true)
            .permitAll();
            }
}

和资源服务器

    @Configuration
    @EnableResourceServer
    public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

        private static final String RESOURCE_ID = "resource-server-rest-api";
        private static final String SECURED_READ_SCOPE = "#oauth2.hasScope('read')";
        private static final String SECURED_WRITE_SCOPE = "#oauth2.hasScope('write')";
        private static final String SECURED_PATTERN = "/secured/**";

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) {
            resources.resourceId(RESOURCE_ID);
        }

        @Override
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().antMatchers("/login", "/resources/**/**","/resources/").permitAll()
            .and().requestMatchers()
                    .antMatchers("/loginSecure", SECURED_PATTERN).and().authorizeRequests()
                    .antMatchers("/loginSecure", SECURED_PATTERN).access(SECURED_WRITE_SCOPE)
                    .anyRequest().access(SECURED_READ_SCOPE)
                    .and().csrf().disable();

        }
}

AuthorizationServerConfigurerAdapter类:

@Configuration
@EnableAuthorizationServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import(ServerSecurityConfig.class)
public class AuthServerOAuth2Config extends AuthorizationServerConfigurerAdapter {
    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private PasswordEncoder oauthClientPasswordEncoder;

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
    }

    @Bean
    public OAuth2AccessDeniedHandler oauthAccessDeniedHandler() {
        return new OAuth2AccessDeniedHandler();
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
        oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()").passwordEncoder(oauthClientPasswordEncoder);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager).userDetailsService(userDetailsService);
    }
}

共有1个答案

戚正业
2023-03-14

在更改高于资源服务器的网络安全配置器适配器的顺序后,我已经解决了这个问题。这是因为资源服务器的过滤器链排名高于 WebSecurityConfigurerAdapter 配置的过滤器链。

参考链接:同一资源的带有Oaust2或Http-Basic身份验证的Spring Security性

 类似资料:
  • 所以我尝试着练习使用数据库,我决定制作一个银行系统。我正在使用MariaDB。我想让用户可以登录,如果信息与数据库中的任何内容都不匹配,他们必须重新输入用户名和密码,直到匹配为止,但我无法确定。这是我第一次在java中实现sql,所以如果我犯了任何错误,我深表歉意。我已经研究过了,但我能找到的解决方案是使用swing或javafx,但我现在不想制作gui。无论如何,我真的不确定我在这部分做什么。

  • 如果URI路径模板变量不能转换为指定的类型,JAX-RS运行时将向客户端返回HTTP 400(“Bad Request”)错误。如果@PathParam注释不能强制转换为指定的类型,JAX-RS运行时将向客户端返回HTTP 404(“未找到”)错误。 有人能解释一下区别吗,也许举个例子?

  • 有人知道如何使用firebase或任何其他服务为flutter拥有自定义用户名和密码登录吗?我不是在说电子邮件验证。用户只需用密码和登录名创建用户名。

  • 我用codeigniter做了一个登录程序,当我在表单中输入错误的用户名或密码时没有问题,它给我的警告就像在程序中一样失败。一开始我以为访问数据库没有问题。而当我输入用户名和密码,这是一个已经添加到数据库,失败警报没有出现,正如它应该。但当我在if-else程序中输入代码时。失败时显示警报,并死亡(“成功”);如果密码和用户名匹配。但是die(success)代码不能工作,当我重定向到其他页面时,

  • 我们有Tomcat 9 Web服务器在生产中。我们面临的问题是,如果Tomcat收到任何格式错误的URL,我们希望显示我们应用程序的自定义错误页面,如下所示 http://URL/| 或 http://URL/[ 我在Tomcat应用服务器的web.xml中添加了错误页面标签,如下所示 我们在tomcat的webapps目录下的应用程序根文件夹中有error.html。 每当用户试图请求任何不存在

  • 问题内容: 我正在做一个Greasemonkey脚本,该脚本通过REST API与Redmine票务管理器进行通信。由于用户需要登录才能从Redmine获取数据,因此我需要一种方法来询问用户在脚本安装时提供的凭据并将其保存到脚本中。 是否可以在不要求用户直接在脚本本身中编辑值的情况下实现? 编辑: 由于已经有此问题的答案,我将验证下面给出的答案,因为这是一个非常好的框架。 问题答案: 这是用于获取