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

use*_*026 7 java spring angular

所以我有这个使用 spring MVC 和 JSP 运行的遗留应用程序,从 mongo DB 读取
,我正在考虑用一个使用 Spring boot 和 angular JS 的现代应用程序替换它

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

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

所以在过去(古老的 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);
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如何用 angular JS 做同样的认证机制?
什么相当于 servlet 中的过滤器?
由于 Angular 是客户端渲染,如何保护它?

感谢您的任何意见!

for*_*rat 4

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

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

正确的身份验证始终必须在服务器端执行,因为客户端上的身份验证很容易绕过。您可以使用一些看门狗来禁止客户端的某些路由,但这只是为了改善用户体验。

基本上有两种风格可供选择:有状态或无状态

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

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

因此,一旦您决定了上述一项,其余的就没有什么不同了。在这两种情况下,您都必须在角度上实现一些拦截器,根据具体情况在每个请求上发送 cookie 或 Auth 标头,并且在服务器端您必须通过相应的过滤器处理请求。您可以以更 RESTful 的方式发送会话值并作为标头,而不是第一个示例中的 cookie。

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

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

我相信您会在网上找到合适的资源来实施您所需的身份验证/授权解决方案