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

如何在Spring Boot Security 2.0中使用两种不同的身份验证方法

梁磊
2023-03-14

我的应用程序对spring-data-rest访问使用基本身份验证(“/API/**”下的所有内容),对面向客户端的API使用UserDetailsService进行JWT身份验证(本例中的所有内容都在“/component”下)。在升级到Spring Boot2之前,我的一切工作如下:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
    private UserDetailsService userDetailsService;
    private BCryptPasswordEncoder passwordEncoder;

    public SecurityConfig( UserDetailsService userDetailsService, BCryptPasswordEncoder passwordEncoder )
    {
        this.userDetailsService = userDetailsService;
        this.passwordEncoder = passwordEncoder;
    }

    @Override
    public void configure( AuthenticationManagerBuilder authenticationManagerBuilder ) throws Exception
    {
        authenticationManagerBuilder
                .userDetailsService( userDetailsService ).passwordEncoder( passwordEncoder )
                .and()
                .inMemoryAuthentication()
                .withUser( "rest" ).password( "something" ).authorities( "REST" ).roles( "REST" );
    }

    @Override
    protected void configure( HttpSecurity http ) throws Exception
    {
        http
                .cors()
                .and()
                .csrf().disable()
                .authorizeRequests()
                    .antMatchers( HttpMethod.POST, SecurityProperties.SIGN_UP_URL, SecurityProperties.LOGIN_URL ).permitAll()
                    .antMatchers( HttpMethod.GET, "/component1/**", "/component2/**", "/component3/**", "/component4/**" ).authenticated()
                    .antMatchers( HttpMethod.POST, "/component1/**", "/component2/**", "/component3/**", "/component4/**" ).authenticated()
                    .antMatchers( HttpMethod.GET, "/api/**" ).hasRole( "REST" )
                    .antMatchers( HttpMethod.OPTIONS, "/api/**" ).hasRole( "REST" )
                    .antMatchers( HttpMethod.PUT, "/api/**" ).hasRole( "REST" )
                    .antMatchers( HttpMethod.PATCH, "/api/**" ).hasRole( "REST" )
                    .antMatchers( HttpMethod.DELETE, "/api/**" ).hasRole( "REST" )
                .anyRequest().authenticated()
                .and()
                .httpBasic()
                .and()
                .addFilter( new JWTAuthenticationFilter( authenticationManager() ) )
                .addFilter( new JWTAuthorizationFilter( authenticationManager() ) )
                .addFilter( new BasicAuthenticationFilter( authenticationManager() ) );
    }
}

CORS的东西有一个单独的配置,我现在不关心,因为它以前工作得很好,现在不是任何麻烦的来源。

因此,在升级到Spring Boot Security2之后,我尝试将每种安全类型的所有内容都放入两个不同的WebSecurityConfigurerAdapter中,这将使其中一个能够工作,无论哪个具有较低的@order(1)数字。我在某种程度上遵循了这里的示例:https://github.com/spring-projects/spring-boot/wiki/spring-boot-security-2.0

我想知道现在是否应该用AuthenticationManagerBuilder删除此配置重写?还是将它们合并成一个文件?我不知道该怎么做,有人有经验吗?

共有1个答案

李安歌
2023-03-14

我今天又回到这里了。我放弃了整个多个WebSecurityConfigurerAdapter,而是重新使用了一个WebSecurityConfigurerAdapter。使用的Spring Security logging level=debug显示了我正在做的Spring5不再支持的一些很容易修复的东西。

 类似资料:
  • 假设我有两个不同的模型和表,分别名为和。 正如你所知laravel使用模型来管理身份验证。但是因为我有两个不同的模型,我想可以分别管理它们。 我使用laravel 5.4,我不知道如何能做到这一点。

  • 我用Java和spring mvc框架编写了一个简单的应用程序。 我使用tomcat领域身份验证表单auth-method对用户进行身份验证,并将其重定向到自己的仪表板。 例如,login.jsp上的用户输入用户名和密码,现在在控制器中检查名称并通过和使用request.login(用户名,密码)方法,然后将重定向客户端发送到仪表板页面。 现在我创建了一个restful api,用于检测来自服务器

  • 我想构建一个API路由,经过身份验证的用户和未经身份验证的用户都可以调用该路由,并根据用户是否经过身份验证返回数据。 我卡在使用身份验证::检查()。 控制器的功能是这样的: 我最后有两个场景: 情景1 在这种情况下,在控制器中,当我检查Auth::check()在if条件内时,无论用户是否经过身份验证,我总是得到错误条件。 方案 2 在这种情况下,在控制器中,当我检查Auth::check()时

  • 问题内容: 我正在尝试连接到HTTPS URL,但是我需要使用客户端身份验证以及第三方软件在我的系统上放置的证书。 我丝毫不知道如何找到或使用它,我所要做的只是C#示例代码,这与我为此找到的所有Java答案都大不相同。(例如,KeyStore显然需要某种密码吗?) 这是我拥有的C#示例代码 然后,它仅遍历WS2_store_Certs CertificateCollection并一路检查它们。再进

  • 在我的Spring启动应用程序中,我有2种不同类型的用户-用户和供应商,它们存储在我的SQL数据库的不同表中。 我只允许访问/user/login和/vendor/login,这将返回一个JWT。 我无法理解如何配置spring security,以便在有人请求/用户/登录时仅检查USERS表,在供应商请求/供应商/登录时仅检查VENDORS表。这可能吗?如果没有,谁能建议我如何配置Spring

  • 问题内容: 如何在AngularJs中使用基本身份验证?我已经在Google上搜索了,但是资源对我来说不起作用。我 非常 新AngularJS 问题答案: 假设您的html定义如下: 您可以使用以下基本身份验证将后端连接到rest api: 请注意,此代码的大部分是方法。如果不需要支持IE9及更低版本,则可以将其替换为本地JS实现- atob()和btoa():https : //develope