【问题标题】:Apache CXF authentication + spring securityApache CXF 身份验证 + Spring Security
【发布时间】:2019-08-25 23:21:57
【问题描述】:

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

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

端点安全配置:

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。结果相同。

验证器:

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() 则所有请求都会通过,但注释不起作用。如果我使用authenticated(),那么在我的验证器工作之前我会得到“拒绝访问”。

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

【问题讨论】:

    标签: java spring soap spring-security cxf


    【解决方案1】:

    您可以尝试使用 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 中找到完整的工作项目: repo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2014-02-26
      • 2013-01-15
      • 2013-10-30
      • 2014-04-07
      • 2012-02-18
      • 2019-04-08
      • 2016-09-01
      相关资源
      最近更新 更多