如何使用 CAS 针对 Spring Boot 后端授权 Angular 5 应用程序

Posted

技术标签:

【中文标题】如何使用 CAS 针对 Spring Boot 后端授权 Angular 5 应用程序【英文标题】:How to authorize Angular5 app against SpringBoot backend using CAS 【发布时间】:2019-03-27 11:35:04 【问题描述】:

我最近一直在编写一个包含以下组件的 WebApp:

后端:带有 SpringSecurity 的 SpringBoot API,可针对第 3 方 CAS 服务器进行授权。

前端: Angular5 应用程序,它基本上查询 API 以获取信息。

问题:我其实有两个问题:

如何同步前后端的 CAS 认证? 当后端将前端重定向到登录页面时,如何避免 CORS 问题?

目前,如果我尝试直接访问后端中的资源,如果我已注销并且一切正常,它会将我重定向到 CAS 登录页面。但是,如果我从 Angular 端访问资源,我会遇到

CAS 登录重定向遇到跨域读取阻塞 (CORB) 阻止跨域响应。

对于第二个问题,我尝试了我在互联网上找到的所有内容,但没有取得多大成功。我已将 @CrossOrigin 添加到我的控制器中,如果我停用安全性,我不会遇到 CORS 问题,但在重定向到第 3 方登录时找不到如何避免它。

如果需要更多信息,我很乐意提供:)

提前致谢!

【问题讨论】:

【参考方案1】:

我是一所主要大学的顾问,现在有几个 spring boot / Angular 应用程序,我们通过将 Angular 应用程序捆绑到后端应用程序的静态资源中解决了这个问题,因此 Angular 应用程序是由嵌入式网络服务器提供服务。

这样,后端的 CAS 过滤器也可以保护对 Angular 应用的访问。

我们唯一需要添加的是 Angular 中的 Http 拦截器,它可以捕获 Http 401 错误,如果 Angular 应用程序在 CAS 令牌过期后进行服务调用,可能会发生这种错误。拦截器重定向到 Spring Boot 应用程序中的路由,该路由又重定向到 CAS 服务器。

【讨论】:

是的,我读过 SpringBoot 为 Angular index.html 提供服务,这样一切都受到后端的保护,但我选择了它作为最后的选择。但是如果没有更好的解决方案出现,我会完全这样做并将其设置为答案。谢谢! :) 我试过你所说的,但有些东西我不太明白:如果我不使用 CAS 保护 Angular 应用程序,当它尝试查询后端时,它会在后端尝试重定向时遇到 CORS到登录页面。如果我保护 Angular 应用程序(基本上是通过要求在 SecurityCONfig 中对“/*”进行身份验证,那么它会正确重定向到登录而不会遇到 CORS。我对此感到非常惊讶,因为所有请求现在都来自同一台服务器。 这个解决方案也大大减慢了开发速度,每次发生变化时,我都必须 mvn clean install 整个东西并部署到 tomcat。在这方面有什么建议吗? 不知道你为什么会遇到其他问题,但是对于 UI 开发,我启动了 spring boot 应用程序,登录到应用程序(这样我的浏览器就有了 CAS 令牌),保留它浏览器选项卡打开,然后再次运行 Angular 部分,它是开发服务器(Angular 应用程序根目录中的“npm start”),这使得应用程序的开发副本在端口 4200 上可用。这需要您设置Angular 的 .proxy 配置将您的服务请求从端口 4200 转发到 Spring Boot 正在服务的任何端口。然后你可以修改 Angular 应用,它会自动重新加载。

以上是关于如何使用 CAS 针对 Spring Boot 后端授权 Angular 5 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 CAS 保护 Spring Boot Rest 服务

spring boot应用集成cas单点登录,post请求拿不到参数

CAS Maven Overlay和Spring Boot不能一起工作

CAS服务器认证成功后,如何使Spring安全将用户重定向到原始请求的页面

在带有 CAS 和 LDAP 的 Grails 中使用 Spring Security

通过 Spring Security 和 CAS 登录后,如何在非安全 JSP 页面上显示登录用户详细信息?