我有使用spring + hibernate + rest构建的后端服务,每个休息服务url接受Json作为输入并给出json作为对forntend(web,Android,Ios)的响应,登录后我们向前端发送一个唯一的随机数,为了访问/调用他使用这个唯一号码的其他服务,现在我想实现弹簧安全性,我想实现基于令牌的独立随机数的通信...任何解决方案?我还需要启动示例代码?
答案 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
用法)
JdbcTokenAuthenticationManager
来执行DAO部分,包括令牌创建和数据库清理希望它有所帮助...