spring-security 在Spring Security中绕过已加密密码的PasswordEncoder

xpszyzbs  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(439)

我有一个REST Sping Boot 2应用程序,我正在尝试实现一个安全机制,它可以接受带有原始密码和加密密码的登录请求。
对于原始密码,应用程序工作正常。我可以创建用户,将他们的加密密码存储在数据库中,并在他们发送原始密码时对他们进行身份验证。
问题是,在某些情况下,我们的客户端服务具有预配置的用户,这些用户具有已经加密的密码,他们需要发送此加密密码进行身份验证。
我目前的配置如下:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Autowired
    private AuthEntryPointJwt unauthorizedHandler;

    @Bean
    public AuthTokenFilter authenticationJwtTokenFilter() {
        return new AuthTokenFilter();
    }

    @Override
    public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(userDetailsService)
                .passwordEncoder(passwordEncoder());
    }

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

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new PasswordEncoder() {

            final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10, new SecureRandom());

            @Override public String encode(CharSequence rawPassword) {
                return encoder.encode(rawPassword);
            }

            @Override public boolean matches(CharSequence rawPassword, String encodedPassword) {
                return encoder.matches(rawPassword, encodedPassword);
            }
        };
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                .csrf()
                .disable()
                .exceptionHandling()
                .authenticationEntryPoint(unauthorizedHandler)
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated();

        http.headers()
                .frameOptions()
                .sameOrigin();
        http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    }

是否有办法绕过PasswordEncoder?因为在某些情况下,已经有一个加密的密码,也许我们所需要的只是将它与现有的存储加密密码进行比较。
另外,这会是一个反模式吗?任何提示都很感激。

iklwldmw

iklwldmw1#

如果你不知道密码是否被编码,你可以尝试这样做,但它需要用相同的算法进行哈希。

@Override public boolean matches(CharSequence rawPassword, String encodedPassword) {
            if(encodedPassword.equals(rawPassword.toString())
                 return true;

            return encoder.matches(rawPassword, encodedPassword);
        }

更新文档:

**布尔值匹配(java.lang.字符序列rawPassword、

java.lang.字符串编码密码)**
验证从存储中获取的编码密码与提交的原始密码是否匹配。如果密码匹配,则返回true;如果不匹配,则返回false。存储的密码本身永远不会解码。
参数:
rawPassword -要编码和匹配的原始密码
encodedPassword -要与之比较的存储中的编码密码
退货:
如果原始密码在编码后与存储中的编码密码匹配,则为true

ktecyv1j

ktecyv1j2#

您可以创建一个密码编码器的noop实现:


**NoOpPasswordEncoder.getInstance()**

要处理编码/原始密码,您可以实现自己的密码:


**AuthenticationEntryPoint**

您可以在其中基于某种头来实现您的逻辑?您可以在SpringSecurity配置中使用它

http.cors().and().exceptionHandling().authenticationEntryPoint(<yourEntryPoint>)

相关问题