如何在 jhipster 中通过 OAuth2 成功登录时执行操作

Posted

技术标签:

【中文标题】如何在 jhipster 中通过 OAuth2 成功登录时执行操作【英文标题】:How to perform actions on successful login via OAuth2 in jhipster 【发布时间】:2016-04-05 08:15:42 【问题描述】:

我想问一下通过OAuth2成功登录后如何执行操作以及如何根据一些先决条件否决登录。我试图在谷歌上搜索并找到一些链接,但我不确定如何在这个框架上做到这一点。可能有一些过滤器等我可以添加,但想知道执行此操作的正确位置。

注意:AuditEvent 对我不起作用,因为每次 API 调用都会调用成功的审计。

参考:http://blog.jdriven.com/2015/01/stateless-spring-security-part-3-jwt-social-authentication/

我需要做的是:

    成功登录后,在表格中记录一些详细信息并向队列发送通知。除了成功登录之外,我还想对成功注销执行一些操作,我知道我可以在这里执行:AjaxLogoutSuccessHandler。但是我找不到类似的地方可以成功登录。

    在通过 OAuth2 登录之前,如果不满足某个条件,那么我可以抛出异常并且不允许该用户。例如,如果用户来自特定的 IP 范围。我在哪里可以添加这个?

请指引我正确的方向。

谢谢

【问题讨论】:

【参考方案1】:

创建 TokenEndpointAuthenticationFilter 实现

CustomTokenEndpointAuthenticationFilter.java

public class CustomTokenEndpointAuthenticationFilter extends TokenEndpointAuthenticationFilter 

    public CustomTokenEndpointAuthenticationFilter(AuthenticationManager authenticationManager, OAuth2RequestFactory oAuth2RequestFactory) 

        super(authenticationManager, oAuth2RequestFactory);
    

    @Override
    protected void onSuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException 

                /* on successful authentication do stuff here */

    

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
                /* before authentication check for condition if true then process to authenticate */
        if (!condition) 
            throw new AuthenticationServiceException("condition not satisfied");
        
        super.doFilter(req, res, chain);
    

AuthorizationServerConfiguration 内进行这些更改

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter 

    @Inject
    private DataSource dataSource;

    @Inject
    private JHipsterProperties jHipsterProperties;

    @Bean
    public TokenStore tokenStore() 
        return new JdbcTokenStore(dataSource);
    

    /* create OAuth2RequestFactory instance */
    private OAuth2RequestFactory oAuth2RequestFactory;

    @Inject
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints)
        throws Exception 
        /* assign value in OAuth2RequestFactory instance */
        oAuth2RequestFactory = endpoints.getOAuth2RequestFactory();
        endpoints
            .tokenStore(tokenStore())
            .authenticationManager(authenticationManager);
    

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception 
        /* register TokenEndpointAuthenticationFilter with oauthServer */
        oauthServer
            .allowFormAuthenticationForClients()
            .addTokenEndpointAuthenticationFilter(new CustomTokenEndpointAuthenticationFilter(authenticationManager, oAuth2RequestFactory));

    

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception 
        clients
            .inMemory()
            .withClient(jHipsterProperties.getSecurity().getAuthentication().getOauth().getClientid())
            .scopes("read", "write")
            .authorities(AuthoritiesConstants.ADMIN, AuthoritiesConstants.USER)
            .authorizedGrantTypes("password", "refresh_token", "authorization_code", "implicit")
            .secret(jHipsterProperties.getSecurity().getAuthentication().getOauth().getSecret())
            .accessTokenValiditySeconds(jHipsterProperties.getSecurity().getAuthentication().getOauth().getTokenValidityInSeconds());
    

【讨论】:

我使用了上述方法,但收到错误消息“未找到客户端身份验证。记得在 TokenEndpointAuthenticationFilter 上游放置一个过滤器”,似乎我缺少一些东西,对此有任何建议

以上是关于如何在 jhipster 中通过 OAuth2 成功登录时执行操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring security oauth2授权服务器中通过jwt令牌获取用户信息?

一个应用程序中的 Spring Security OAuth2 身份验证和表单登录

JHipster - OAuth2/OIDC 需要从访问令牌中读取组

使用 JHipster、Spring Security 和 oauth2 控制身份验证重定向

使用 keycloak rest admin API (Oauth2) 修改用户姓氏后 jhipster 重新加载 OIDC 令牌

使用JHipster,Spring Security和oauth2控制身份验证重定向