java - Apache CXF 身份验证 + Spring Security

标签 java spring soap spring-security cxf

我想在基于 Apache-CXF 的 SOAP 应用程序中使用 @RolesAllowed(或类似)注释。但我不明白如何为此配置 Spring Security。

我想从 SOAP 消息中的 XML header 进行身份验证。

端点安全配置:

Map<String, Object> props = new HashMap<>();
props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
endpoint.getInInterceptors().add(new WSS4JInInterceptor(props));

endpoint.getProperties().put("ws-security.validate.token", false);
endpoint.getProperties().put("ws-security.ut.no-callbacks", true);
endpoint.getProperties().put("ws-security.ut.validator", 
                             CredentialValidator.class.getName());

还尝试使用CallbackHandler。结果相同。

validator :

public class CredentialValidator extends UsernameTokenValidator {
    @Override
    public Credential validate(Credential credential, RequestData data)
                  throws WSSecurityException {
        String userName = credential.getUsernametoken().getName();
        String password = credential.getUsernametoken().getPassword();

        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(Role.USER_ROLE));

        PreAuthenticatedAuthenticationToken token = new 
           PreAuthenticatedAuthenticationToken(
               userName, 
               password, 
               authorities);
        SecurityContextHolder.getContext().setAuthentication(token);
    }   
}

Spring 安全配置:

@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers(HttpMethod.POST, "/services/**")
          .permitAll()
        ;
    }
}

如果我在配置中使用permitAll(),那么所有请求都会通过,但注释不起作用。如果我使用authentiated(),那么在我的 validator 工作之前我会收到“访问被拒绝”的消息。

我在 @WebService 接口(interface)中使用 @AllowedRoles 注释。

最佳答案

您可以尝试使用 TokenFilter,而不是使用 CredentialValidator。 您的 Spring Security 配置应如下所示:

@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers(HttpMethod.POST, "/services/**")
      .authenticated()
      .addFilterBefore(tokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
  }

@Bean
public TokenFilter tokenFilterBean() {
    return new TokenFilter();
  }    

}    

您可以在我的存储库中找到完整的工作项目: repo

关于java - Apache CXF 身份验证 + Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55511943/

相关文章:

java - Spring新手: how to override properties for Test application

java - JedisConnectionFactory 超时

java - Spring JPA (Hibernate) 没有 : javax. 类型的限定 bean persistence.EntityManagerFactory

java - 如何结合 HttpServletRequest + @RestController

java - Joda Time - Hibernate 将昨天的日期插入数据库

java - 如何设置wsdl生成的webservice名称?

java - 在 AsyncTask 中使用 Gson 写入/读取 JSON 时发生 android.os.TransactionTooLargeException

java - 我在 Linux 上有一台 8 GB RAM 和 32 位 JVM 的机器,我想让 JVM 最大程度地使用 RAM

java - RapidMiner 6安装问题

c# - 在 Visual Studio 2008 中将 Soap header 添加到 Soap 请求