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

Spring Oaut2。DaoAuthenticationProvider中未设置密码编码器

洪伟彦
2023-03-14

我对Spring Oauth和Spring Security很陌生。我正在尝试在项目中使用client\u凭据流。目前,我设法使用自己的CustomDetailsService,以便从系统中已经存在的数据库中获取client\u id和密码(secret)。唯一的问题是,我无法更改AuthorizationServer使用的DaoAuthenticationProvider中的密码编码器-它默认设置为明文密码编码器。我无法使用SHAPasswordEncoder这样的方式对其进行配置。它总是使用明文编码器。我可能不太了解流程,因为我是Spring的新手。

这是我的一些代码(没有DaoAuthentiationProvider的工作配置):

安全Config.java

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

private static final String RESOURCE_ID = "restservice";

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/register/**");

}

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

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(daoAuthenticationProvider());
}

@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
    DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
    daoAuthenticationProvider.setUserDetailsService(userDetailsService());
    daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
    return daoAuthenticationProvider;
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new ShaPasswordEncoder();
}

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private MyCustomClientDetailsService myCustomClientDetailsService;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints)
            throws Exception {
        endpoints.tokenStore(tokenStore());
    }

    @Bean
    public ResourceServerTokenServices defaultTokenServices() {
        final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setSupportRefreshToken(true);
        defaultTokenServices.setTokenStore(tokenStore());
        return defaultTokenServices;
    }

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

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(myCustomClientDetailsService);
    }

    @Bean
    public MyCustomClientDetailsService detailsService() {
        return new MyCustomClientDetailsService();
    }
}

@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    ...
}
}

和自定义ClientDetailsService类:

public class MyCustomClientDetailsService implements ClientDetailsService {

@Autowired
private UserService userService;

@Override
public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {

    User fan = userService.getFan(clientId);

    if (fan == null) {
        throw new NoSuchClientException("No client with requested id: " + clientId);
    } 

    BaseClientDetails details = new BaseClientDetails(clientId, restservice, "write", "client_credentials", "USER");

    details.setClientSecret(fan.getEncodedPassword()); 

    return details;
}
}

从my UserService获取的encodedPassword始终是一个错误的凭据,因为DaoAuthenticationProvider在默认情况下设置了明文密码编码器。

我错过了什么?是否可以在DaoAuthenticationProvider中设置用于检查此处凭据的密码编码器?或者我必须编写自己的AuthenticationProvider,以我想要的方式进行检查吗?

共有2个答案

房泉
2023-03-14

如果您只想用另一个pass编码器配置spring身份验证,请使用此配置。

<bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder"/>

 <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="authenticationService">
       <password-encoder ref ="encoder" /> 

          <!--   <user-service>
                <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN"/>
            </user-service> -->
        </authentication-provider>
    </authentication-manager>

注意:-在创建用户期间,您需要使用相同的密码编码器类加密userpassword。

范霄
2023-03-14

我发现这个问题的解决方案是覆盖AuthorizationServerConfigurerAdapter上的configure

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.passwordEncoder(passwordEncoder);
}
 类似资料:
  • 我将xml发送到web服务,并在那里将输入xml转换为字符串,现在设置其编码时遇到问题。下面是一个代码: 这段代码从请求xml生成一个String。问题是,当请求XML不是以UTF-8编码时,它会在xml元素中产生不可读的字符: 当我发送UTF-8编码的xml时,没有问题。因此,问题是如何在将xml转换为字符串时设置UTF-8编码。 JVM使用的默认编码是ISO8859-1。

  • 问题内容: 我在本地计算机上使用Redis,所以我真的不需要设置密码即可通过php客户端连接到服务器(我使用predis作为客户端)。但是,我将应用程序移动到实时服务器,因此我想设置一个密码以连接到我的Redis服务器。 我有几个问题: 我在互联网上检查了如何设置密码,好像我需要在redis.conf中添加密码。我找不到我应该完全添加到配置文件中来设置密码的内容。 另外在predis我应该如何添加

  • 我试图设置并检查NFC标签(类型:NTAG213)中的密码,但当我试图设置密码时,总是收到< code>IOException(收发失败)。 我不明白我必须为密码和ACK包设置哪个页面。这是我使用 Xamarin 用 C# 编写的代码。请随时用原生的Android Java代码回复。

  • 我的logback.xml如下: 当我查看wireshark的输出时,我只看到记录的JSON(没有给出PRI头字段) 如果切换到标准logback Syslog appender(非JSON输出)

  • 问题内容: 我正在尝试从http://api.freebase.com/api/trans/raw/m/0h47检索数据 正如您在文本中看到的那样,这里有一些唱歌: 。 当我尝试从页面获取源代码时,我会听到带有诸如此类的文字。 到目前为止,我已经尝试使用以下代码: 我究竟做错了什么? 我的整个代码: 问题答案: HTML页面采用UTF-8,并且可以使用阿拉伯字符等。但是Unicode 127以上的

  • 我按照集装箱主页上Linux安装说明。 在lxc create命令之后,我选择了Ubuntu、Trusty和i386,然后显示了一条消息: 直接在rootfs中使用lxc-attach或chroot设置根密码或创建用户帐户。 所以,我转到了和ran