弹簧安全饼干+ JWT身份验证
我必须说我对整个模型感到非常困惑,我需要帮助将所有浮动部分粘合在一起。
我不是在做Spring REST,只是普通的WebMVC控制器。
我的任务:我想要一个使用用户名+通过身份验证的表单登录。我想针对第三方服务进行身份验证。成功后,我想返回一个cookie,但不使用默认的cookie令牌机制。我希望 Cookie 具有 JWT 令牌。通过利用cookie机制,每个请求都将与JWT一起发送。
因此,为了分解它,我有以下模块要处理:
- 在执行用户时对第三方服务进行身份验证 + pas logi n
成功进行身份验证后,将 Cookie 会话令牌替换为我的自定义实现
每次请求时,从cookie解析JWT(使用过滤器)
从JWT中提取用户详细信息/数据,以便控制器可以访问
令人困惑的是?(请纠正我哪里错了)
第三方身份验证
要针对第三方进行身份验证,我需要通过扩展身份验证提供程序来拥有自定义提供程序
public class JWTTokenAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate( Authentication authentication ) throws AuthenticationException {
// auth against 3rd party
// return Authentication
return new UsernamePasswordAuthenticationToken( name, password, new ArrayList<>() );
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals( UsernamePasswordAuthenticationToken.class );
}
}
问题:
- 当用户提交表单用户+ pass时,此提供程序是否在成功身份验证/登录时执行?如果是这样,这与抽象身份验证处理Filter#successAuthentication有什么关系?
- 我是否必须返回用户名密码验证令牌的实例?
- 我必须支持UsernamePasswordAuthenticationToken才能在这里获得用户+通行证吗?
将 Cookie 令牌替换为 JWT
不知道如何优雅地做到这一点,我可以想到很多方法,但它们不是Spring Security的方式,我不想打破这种流动。非常感谢这里的任何建议!
使用来自 Cookie 的每个请求解析 JWT
据我所知,我需要扩展抽象身份验证处理过滤器,就像这样
public class CookieAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
@Override
public Authentication attemptAuthentication( HttpServletRequest request, HttpServletResponse response )
throws AuthenticationException, IOException, ServletException {
String token = "";
// get token from a Cookie
// create an instance to Authentication
TokenAuthentication authentication = new TokenAuthentication(null, null);
return getAuthenticationManager().authenticate(tokenAuthentication);
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
super.doFilter(req, res, chain);
}
}
问题:
- 何时调用 AbstractAuthenticationProcessingFilter#successAuthentication?它是在用户登录时调用的,还是在 JWT 令牌成功验证时调用的?
- 此筛选器与我之前发布的自定义提供程序之间是否存在任何关系?经理应该会根据令牌实例调用自定义提供程序,该令牌实例与通过支持方法支持的提供程序匹配?
似乎我拥有我需要的所有部分,除了cookie会话替换,但我无法将它们放入一个单一的连贯模型中,我需要一个足够了解机制的人,这样我就可以把所有这些粘合到一个模块中。
更新 1
好吧,我想我正在达到这个开始的地方...https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.java
此筛选器将自身注册到 POST -> “/login”,然后创建 UsernamePasswordAuthenticationToken 的实例,并将控件传递给下一个筛选器。
问题是 Cookie 会话设置在哪里....
更新 2
dos的这一部分给出了我错过的顶级流程,因为无论谁正在经历这一点,请看一下这里......http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#tech-intro-authentication
本节内容涉及身份验证提供程序...http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#core-services-authentication-manager
更新3 - 工作案例,这是最好的方法吗?
因此,在挖掘了Spring Security文档及其来源之后,我得到了最初的模型。现在,这样做,我意识到有多种方法可以做到这一点。关于为什么选择这种方式VS的任何建议,Denys在下面提出了什么?
下面的工作示例...