Spring Boot和Angular身份验证-如何保护应用程序



因此,我有一个使用spring MVC和JSP运行的遗留应用程序,从mongo DB中阅读
,我正在考虑用一个使用spring引导和angular JS 的现代应用程序来取代它

我不是在寻找一个框架,我的问题更多的是关于身份验证的概念,以及它如何在angular和Spring引导之间工作。

我不想使用第三方进行身份验证,我想继续使用我的内部数据库用户和密码
我还有一个rest API,客户端需要首先注册该API,然后绕过angular和身份验证在每个请求上发送令牌。

所以在过去(古老的j2ee),我有Servlet过滤器,这个过滤器战争在任何请求上运行,它检查会话是否经过身份验证,如果没有,它会转发到身份验证页面,然后将结果存储在会话中。

大致如下:

@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURI = request.getContextPath() + "/login";
boolean loggedIn = session != null && session.getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);
if (loggedIn || loginRequest) {
chain.doFilter(request, response);
} else {
response.sendRedirect(loginURI);
}
}
// ...
}

如何使用angular JS实现相同的身份验证机制
什么等效于servlet中的过滤器
由于Angular是客户端渲染,如何保护它?

感谢您的意见!

我不是在寻找框架,我的问题更具概念性关于身份验证,以及它如何在angular和Spring之间工作靴子

我发现这个问题很难回答,因为你要求的是特定框架之外的概念答案,但你指的是Angular和Spring这两个框架,所以让我们后退一步。

正确的身份验证总是必须在服务器端执行,因为客户端的身份验证很容易绕过。你可以有一些监管机构来禁止客户端的某些路由,但只是为了提高用户体验。

基本上有两种口味可供选择:状态或无状态

状态身份验证是指在成功身份验证后,服务器将创建某个会话,存储该会话的某个标识符,并在后续请求中对其进行验证。这是传统的使用cookie的会话方法,在春季命名为JSESSION。这种方法的缺点是必须在某个地方维护状态,除非你有粘性会话(你可以通过将这些信息保存在内存中来逃避),否则你需要一些分布式系统来存储/检索它(SQL数据库、cassandra、你的宠物项目等)。但正如我们所了解到的,具有高流量的分布式状态会成为瓶颈,最好尽可能避免它。

无状态身份验证:与JWT的情况一样,JWT包含在任何服务器上重新创建会话所需的所有信息,因此不存在分布式状态,或者更好地说,该状态在客户端(浏览器)中,并且经过加密签名,因此用户可以访问/篡改它们。缺点是,令牌的加密/解密可能需要一点CPU,但对用户来说没有什么可注意的。

所以,一旦你决定了上面的一个,剩下的就没什么不同了。在这两种情况下,您都必须在angular上实现一些拦截器,根据情况在每个请求上发送cookie或Auth头,在服务器端,您必须通过相应的过滤器处理请求。您可以以更RESTful的方式发送会话值和作为头,而不是第一个示例中的cookie。

我还有一个rest API,客户端需要先注册,然后再注册绕过angular和身份验证,在每个请求上发送一个令牌。

对于您的API来说,这看起来像是一个新的用例,但上述情况仍然适用,在登录完成后,您仍然可以使用这些身份验证头进行授权并且令牌/会话被返回给认证用户。您还可以为这种类型的客户端提供不同的身份验证令牌,在这种情况下,只需链接一个新的过滤器来检查此标头,而不会对API进行任何更改。

我相信你会在网上找到合适的资源来实现你想要的身份验证/授权解决方案

显而易见的想法是:https://spring.io/guides/tutorials/spring-security-and-angular-js/

如果您试图使用静态资源在同一个端口上为angular提供服务,那么您将很难用spring boot进行设置,因为在谁应该解决特定资源(angular或spring boot)的问题上会发生冲突。例如:/home可以通过angular解析,但spring不知道存在/home的事实,如果您直接点击/home,则不会通过angular进行解析,除非加载了index.html,并且您将看到404 Whitelabel页面。

如果您在单独的端口上提供角形和弹簧套,那么您必须阅读以上弹簧指南中的这句话:

您不可能拥有一个安全的、无状态的应用程序。

Hopey One已经指出:使用JHipster并不像你想象的那么糟糕。你几乎不需要一天的时间来构建80%的项目,然后你可以相应地调整剩下的20%。它将处理大部分知识空白,并让您编写实际需要的代码。由于您已经有一个正在运行的应用程序,所以大部分都是复制粘贴工作。您可以阅读本指南来设置环境。

看看JHipster项目。无需付出太多努力,您就可以生成一个基于angular和spring-boot的简单项目。它使用您选择的数据库实现JWT身份验证。可以作为一个很好的引导程序,或者作为实现项目的参考实现。

我建议探讨以下两个主题:

  • 后端:https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/
  • 字体末尾:https://blog.angular-university.io/angular-jwt-authentication/

Filterservlet-api的一部分,这意味着过滤器可以在任何库中实现,web服务器将注册并映射到特定的url。在我们的例子中,您的LoginFilterJWTAuthenticationFilter非常相似,但通过Spring Framework的附加功能,这两个类都实现了Filter接口。

使用Spring Boot,您希望使用Spring Security并尽可能在框架之上构建。我看到三种方法:

  • https://www.baeldung.com/spring-security-login-angular使用基本的身份验证并在客户端上存储用户名/密码-不确定我是否喜欢这个

  • https://automateddeveloper.blogspot.com/2014/03/securing-your-mobile-api-spring-security.html如果需要的话,利用会话以及记住我的cookie。看起来是web客户端的不错选择

  • https://bootify.io/docs/rest-api-spring-security-with-jwt.htmlJWT用于无状态REST客户端(例如其他服务器),也可以用于angular(在客户端存储JWT)

最新更新