Spring Security +基于令牌的服务调用

时间:2014-09-12 07:26:01

标签: json spring token

我有使用spring + hibernate + rest构建的后端服务,每个休息服务url接受Json作为输入并给出json作为对forntend(web,Android,Ios)的响应,登录后我们向前端发送一个唯一的随机数,为了访问/调用他使用这个唯一号码的其他服务,现在我想实现弹簧安全性,我想实现基于令牌的独立随机数的通信...任何解决方案?我还需要启动示例代码?

1 个答案:

答案 0 :(得分:0)

不幸的是,Spring安全性没有开箱即用的令牌安全性实现。您将在以下帖子中找到一些线索:

我必须自己实施它并不是那么简单......明显的部分是你需要一个过滤器。我的要求是令牌具有时间限制的有效性,即使应用程序部署在多个服务器上(冗余)也可以使用,因此我将令牌存储在数据库中。我结束了:

  • 使用以下TokenAuthenticationFilter方法定位为PRE_AUTH_FILTER的doFilter

    @Override
    public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws IOException, ServletException {
        boolean tokenAuthenticated = false;
        HttpServletRequest request = (HttpServletRequest) sr;
        String token = findToken(request);
        if ((null == token) || (!authenticationNeeded(request))) {
            fc.doFilter(sr, sr1);
            return;
        }
        if (needHttps && (! request.isSecure())) {
            TokenAuthenticationToken at = new TokenAuthenticationToken(token);
            try {
                at.setDetails(detailsSource.buildDetails(request));
                Authentication auth = manager.authenticate(at);
                if ((auth != null) && (auth.isAuthenticated())) {
                    SecurityContextHolder.getContext().setAuthentication(auth);
                    tokenAuthenticated = true;
                }
            } catch (AuthenticationException e) {
                logger.debug("Authentication failed :", e);
            }
        }
        else {
            logger.info("Token identification rejected : proto != https");
        }
        fc.doFilter(sr, sr1);
        if (tokenAuthenticated) {
            logger.debug("Token authenticated : invalidate session");
            HttpSession session = request.getSession(false);
            if (session != null) {
                session.invalidate();
            }
        }
    }
    
  • 一个JdbcTokenAuthenticationProvider(使用前一个过滤器设置的TokenAuthenticationToken)将过滤器部分与真正的身份验证部分分开(并坚持常见AuthenticationManager用法)

  • a JdbcTokenAuthenticationManager来执行DAO部分,包括令牌创建和数据库清理

希望它有所帮助...