在我的Spring Security应用程序中,我能够使用postman成功地从我的"/oauth/token"端点获取JWT令牌。但是,我希望任何人都可以访问/oauth/endpoint,而无需 clientId 和机密进行身份验证。
我的安全服务器
@Configuration
@EnableWebSecurity
public class GatewaySecurityConfigurer extends WebSecurityConfigurerAdapter {
@Autowired
private GatewayUserDetailsService gatewayUserDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
daoAuthenticationProvider.setUserDetailsService(gatewayUserDetailsService);
return daoAuthenticationProvider;
}
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) {
authenticationManagerBuilder.authenticationProvider(daoAuthenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/oauth/token").permitAll()
.antMatchers("actuator/**").fullyAuthenticated();
}
}
和我的资源服务器
@EnableResourceServer
@Configuration
@Import(GatewaySecurityConfigurer.class)
public class GatewayResourceServerConfigurer extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config.tokenServices(tokenServices());
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/oauth/token").permitAll()
.antMatchers("actuator/**").fullyAuthenticated();
}
@Bean
public TokenStore tokenStore() {
TokenStore store = new JwtTokenStore(accessTokenConverter());
return store;
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("123");
return converter;
}
@Bean
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
defaultTokenServices.setSupportRefreshToken(true);
return defaultTokenServices;
}
}
正如您在这两个类中看到的那样,我尝试实现一个 HttpSecurity 配置,该配置将允许所有对/oauth/token 的请求,这些请求具有需要进行身份验证的其他路径。然而,当我在没有clientId和secret的情况下发帖时,我的邮递员请求中有401个空http响应。
我怎样才能让我的代码,这样不需要clientId和Secret来进行身份验证?
OAuth是一个授权框架。(请参阅 RFC 6749。它允许第三方应用程序(客户端(代表用户获取对 HTTP 服务的有限访问权限。没有客户端的授权没有意义。
您可能只需要一个简单的端点,用户可以在其中登录并获取 JWT。
以下教程解释了如何使用自定义 Spring 安全过滤器构建 JWT 身份验证: https://auth0.com/blog/securing-spring-boot-with-jwts