我如何实施自定义身份验证?

时间:2017-10-27 14:03:54

标签: java angularjs spring spring-security spring-oauth2

我必须将我的系统与第三方提供商集成。该系统由Spring和Angular制作。

请注意,我需要创建自定义登录表单,而不是重定向到OAuth2等第三方提供商表单。

他创建了以下端点:

获取令牌身份验证

POST http://example.com/webapi/api/web/token

“username=972.344.780-00&password=123456&grant_type=password”

响应向我发送了一个我必须在下一次请求中使用的令牌。

获取用户信息

Authorization: Bearer V4SQRUucwbtxbt4lP2Ot_LpkpBUUAl5guvxAHXh7oJpyTCGcXVTT-yKbPrPDU9QII43RWt6zKcF5m0HAUSLSlrcyzOuJE7Bjgk48enIoawef5IyGhM_PUkMVmmdMg_1IdIb3Glipx88yZn3AWaneoWPIYI1yqZ9fYaxA-_QGP17Q-H2NZWCn2lfF57aHz8evrRXNt_tpOj_nPwwF5r86crEFoDTewmYhVREMQQjxo80

GET http://example.com/webapi/api/web/userInfo

那就是说,我需要实现自定义身份验证?

在这种情况下我可以使用Spring OAuth2吗?

3 个答案:

答案 0 :(得分:1)

您可以使用Spring Security。流程如下。您对安全令牌服务进行身份验证。包含身份验证令牌的cookie将写入您的浏览器。此令牌将在针对服务器的每个后续请求中发送。

在其余服务器上,您将使用Srping Security,更具体地说,您需要在其实现中使用AbstractPreAuthenticatedProcessingFilter,您将提取令牌并将其与安全上下文相关联。

以下是spring security

的示例配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


  @Bean
  public AuthenticationManager authenticationManagerBean() throws Exception {
    // TODO Auto-generated method stub
    return super.authenticationManagerBean();
  }

  public void configure(WebSecurity web) throws Exception {
        // do some configuration here
  }

  @Override
  public void configure(HttpSecurity http) throws Exception {
       // configure your Security here 
       // you can add your implementation of AbstractPreAuthenticatedProcessingFilter here
  }

}

这是您的其他配置

@Configuration
public class ExampleSpringSecurityConfig{


    @Bean
    public AuthenticationManager authenticationManager() {
        return authentication -> authProvider().authenticate(authentication);
    }

    private AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> userdetailsService() {
       // Construct your AuthenticationUserDetailsService here
   }

    @Bean
    public PreAuthenticatedAuthenticationProvider authProvider() {
        PreAuthenticatedAuthenticationProvider authProvider = new PreAuthenticatedAuthenticationProvider();
        authProvider.setPreAuthenticatedUserDetailsService(userdetailsService());
        return authProvider;
    }





}

答案 1 :(得分:0)

是的,您可以使用Spring Oauth2。您必须实现资源所有者密码凭据授予Oauth2流。 您必须为最终用户创建登录页面,并且您的客户端应用程序将向授权服务器发送用户的凭据以及客户端系统凭据(使用客户端系统凭据的HTTP基本身份验证)以获取令牌。

有两种方法可以实现它 -

  1. 使用客户端系统ID和密码 - 使用此授权类型调用令牌端点时,需要传入客户端ID和密码(使用基本身份验证)。
  2. curl -u 972.344.780-00:123456“http://example.com/webapi/api/web/token?grant_type=password&username=addEndUserNameHere&password=addEndUserPasswordHere

    • 仅使用客户端系统ID(无客户端系统密码) - 授权服务器应具有客户端设置以支持此流而无需任何密码 -

    AuthorizationServerConfigurerAdapter的子类应具有以下代码 -

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {    
            clients.inMemory()
                .withClient("clientId")
                .authorizedGrantTypes("password")
                .authorities("ROLE_CLIENT")
                .scopes("read");
        }
     }
    
    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.allowFormAuthenticationForClients();
    }
    

    现在您可以使用以下 -

    POST http://example.com/webapi/api/web/token?grant_type=password&client_id=my-trusted-client&scope=trust&username=addEndUserNameHere&password=addEndUserPasswordHere

    注意 - 此流程不如其他Oauth2流程安全,仅推荐用于受信任的客户端应用,因为用户必须向客户端应用提供凭据。

答案 2 :(得分:0)

见这里的例子

将JWT与具有Angular的Spring Security OAuth2一起使用

在本教程中,我们将讨论如何使用Spring Security OAuth2实现来使用JSON Web令牌。

http://www.baeldung.com/spring-security-oauth-jwt

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore())
                 .accessTokenConverter(accessTokenConverter())
                 .authenticationManager(authenticationManager);
    }

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

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("123");
        return converter;
    }

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