带有Spring Security的AngularJS Web应用程序

我正在开发一个AngularJS应用程序中的Spring Security。 我对这两种技术都比较陌生,我找到了几个非常有用的网站,其中包含如何实现AngularJS和Spring Security的教程和示例。

我目前的问题在于限制某些用户的URL路径。 这听起来像是一个简单的问题,但我已经淹没了自己的文档,试图弄清楚以前必须解决的问题。

在AngularJS中,导航到不同的URL时URL中有一个哈希标记,这似乎导致Spring出现问题。 没有抛出错误,但资源不受限制。 我的代码如下:

web.xml中

   contextConfigLocation  /WEB-INF/paperwebapp-servlet.xml    org.springframework.web.context.ContextLoaderListener   webapp org.springframework.web.servlet.DispatcherServlet  contextConfigLocation *  1   webapp /   characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter  encoding UTF-8   forceEncoding true    characterEncodingFilter /*    springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /*  

APP-servlet.xml中

        

弹簧security.xml文件

                   

部署应用程序后,我可以访问URL(localhost:8080 / app),并按照预期向我发送登录页面。 一旦我通过身份validation,我也会按预期进入启动画面(/#/ splash)。 但是,如果我使用“用户”凭据登录,我应该被限制在/ inventory路径中。 无论我尝试什么(/#/库存,/库存,#/库存等)我都无法限制资源。 我已经在直接从应用程序目录访问HTML页面的应用程序上测试了这个配置,它似乎工作正常,因此我确信它与AngularJS控制器路由请求和使用该哈希标记有关。

我在研究这个问题时发现的另一个兴趣点是,因为我们使用来自多个源的模板来编译每个页面,所以我们不能使用$ locationProvider来设置HTML5模式而不会破坏应用程序。

如果有人对此问题有任何见解,我们将不胜感激。 我确信这已经到了某个地方,但对于我的生活,我找不到任何东西。 谢谢!

您似乎将Angular的客户端URL处理(基于散列,如’/#/ splash’)与Spring MVC(以及Spring Security的)服务器端URL处理混淆。

请记住,Spring Security可以保护对服务器端URL的访问,而Angular是一个单页的客户端库。

当您第一次访问Angular页面时,您将从服务器获取它,Spring Security可以根据登录限制访问。

如果您仍然在客户端上的单页Angular环境中,并通过Angular导航到“页面”并在URL中使用哈希(请参阅有关hashbang URL的AngularJS $位置指南 ),那么您不会发出服务器请求。 您正在请求Angular呈现不同的模板或状态。 这是客户端行为,因此不涉及Spring Security。 当您访问模板HTML文件(Spring可能无需身份validation而静态返回)或者您已设置REST api以从服务器获取数据(通常返回应用程序使用的JSON格式数据)时,您会发出服务器请求。

我相信,为了使这项工作,受保护资源(“/ inventory”)的数据不必包含在主应用程序中,需要单独的服务器端资源。 这可以包括页面的HTML模板和/或数据。 您的AngularJS应用程序应该能够识别出该资源不可用,并向用户显示某些内容以传达缺少授权的信息。