Angular 2 和 Spring Kerberos
Posted
技术标签:
【中文标题】Angular 2 和 Spring Kerberos【英文标题】:Angular 2 and Spring Kerberos 【发布时间】:2017-06-25 23:58:59 【问题描述】:是否可以在 Angular 2 应用程序中使用 Kerberos?我们正在使用 Spring,它托管我们的 REST 服务,并使用 Kerberos 保护 Angular 2 资源。我们想要添加角色并定义 Angular2 应用程序中的哪些功能可用于某些角色。关于如何执行此操作的信息似乎很少,因为大多数人似乎已经使用 JWT 或 OAuth。
是否可以使用 Kerberos 进行初始身份验证,然后生成一个发送回浏览器的 JWT?
目前我正在考虑设置一个 REST 端点 /user ,它返回有关当前登录用户的所有信息,包括他/她的权限。然后在 Angular 中,我可以读取这些权限并相应地操作 UI 和路由。来自服务器的数据已经受到 Kerberos 和 Spring 的保护。因此,如果用户仍然可以更改其本地 Angular 以访问一些受保护的路由,他们将看不到任何数据。
【问题讨论】:
【参考方案1】:你说的完全正确。您可能希望通过后端处理身份验证,无论是 Kerberos、OAuth 还是其他。成功登录后,后端将返回一个元数据响应,允许 UI 进行适当的自我配置。由于后端是受保护资源所在的位置,因此 UI 并不真正需要“保护”,但更需要“动态配置”以适合给定用户。
你必须决定你想怎么做,以及你想在哪里写你的大部分逻辑。例如,后端可以返回简单的角色或体验标识符(例如管理员、用户、访客)。从那里,用户界面会知道应该/可以执行哪些活动,哪些资源可用等。用户界面会知道例如客人不能添加新用户,但是,因为客人先生可能会好奇,最重要的问题是后端确实不允许他修改用户帐户。
【讨论】:
【参考方案2】:这将是 JWT 令牌的完美用例。一旦您在服务器端通过身份验证,后端服务就可以创建一个具有特定用户角色的 JWT 令牌,并将其返回给 Angular2 应用程序。 Angular 应用程序可以根据用户的角色配置 UI。在每个连续的服务器调用上,角度应用程序都可以发回这个令牌,以便这个令牌用于查找用户的角色。 Spring security 允许在 Authentication 之前添加自定义过滤器,可用于验证令牌。
@Configuration
public class WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http.addFilterAfter(new TokenFilter(), BasicAuthenticationFilter.class);
在 TokenFilter 内部,可以解析 JWT 令牌以查找用户角色并允许访问特定的受保护资源。如果有人试图修改令牌或请求禁止的保护资源,JWT 令牌验证将失败。
public class TokenFilter extends GenericFilterBean
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
// Validate Token her for the requested url
if(validateToken(request.getHeader("auth"))
chain.doFilter(request, response);
else
// return 403 response
【讨论】:
【参考方案3】:您在后端选择的身份验证技术不应影响您在前端的决策,无论是 OAuth、JWT、Kerberos 还是定制的东西。
您需要使用 Kerberos 在后端对用户进行身份验证,将票证(身份验证令牌)保存在前端的某个位置(例如,在 cookie 或本地存储中),并在使用该票证对未来的请求进行身份验证时。这将需要一些自定义代码和 Kerberos 协议的基本知识(http://www.roguelynn.com/words/explain-like-im-5-kerberos/、Kerberos authentication in Node.js https.get or https.request),因为我在 Angular2 中没有看到任何现有的 Kerberos 协议实现(不过应该不会太难)。
您可以在 Kerberos 上使用 JWT,但这需要在端点和前端之间增加一层。恕我直言,坚持使用您已经在使用的一种技术(Kerberos)会更容易。
然后,您可以在 Angular2 中实现自定义保护以保护路由免受未经授权的访问(请参阅https://blog.thoughtram.io/angular/2016/07/18/guards-in-angular-2.html)。
【讨论】:
以上是关于Angular 2 和 Spring Kerberos的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 和 Angular 2 的 URL 处理问题
使用 Angular 2 和 Spring Boot 发送发布请求