使用 AngularJS 和 Spring Security 的单页应用程序中需要 AntMatchers

Posted

技术标签:

【中文标题】使用 AngularJS 和 Spring Security 的单页应用程序中需要 AntMatchers【英文标题】:AntMatchers needed in a SinglePage Application using AngularJS and Spring Security 【发布时间】:2016-09-01 22:01:38 【问题描述】:

我有一个单页应用程序客户端使用 AngularJS,而服务器端使用 Spring MVC、REST、Spring Data。部署应用程序时,spring mvc 呈现一个 JSP 页面,该页面具有对应于多个命名 ui-view 的 Angular JS 标签页面的各个部分,如页眉、页脚、菜单和主要内容区域。

Dispatcher servlet 的 url 映射为 /ui*。我唯一的 spring MVC 控制器将自身呈现给 home.jsp。 home.jsp 有多个命名的 angularJS ui-view 标签,如下所述。路由在 controller.js 中定义。 web.xml 如下图所示。使用 Spring 数据 mongodb 进行 CRUD 操作的 REST API 数不胜数。

我想使用带有 Java 配置的 Spring 安全性来保护这个应用程序。

我正在我的 SecurityConfiguration.java 文件中尝试如下代码,以允许在没有身份验证的情况下呈现登录页面,并且必须在从浏览器访问之前对其他页面进行身份验证。登录页面应该是应用程序的唯一入口点。但是,此代码不起作用。 请指教。

注意 :- 这是一个单页应用程序。应用程序只有一个 SpringMVC 控制器,当我们访问 url (http://localhost:8080/root/ui/login) 时,它会在应用程序 Home.jsp.Post 部署中呈现 singleJSP 根据 angularJS 应用程序中配置的路由,url 更改为使用 fragmentidentifier 作为 url (http://localhost:8080/root/ui/login#/login) 呈现登录页面。 单击任何其他超链接时,仅片段标识符会更改,并对 DB 进行 REST 调用并填充页面特定部分的数据。对于 Ex :- 单击 chDetail 超链接时,url 更改如下 (http://localhost:8080/root/ui/login#/chDetail) 并加载该部分的数据。请告知如何编写适当的 antMatchers 以便 登录页面可以不安全地访问,而其他页面需要经过身份验证才能访问。

安全配置代码如下:-(请在此处提供代码)

<code>
http.csrf().disable().httpBasic()
      .and()
      .authorizeRequests()
      .antMatchers("/ui/login#/login").permitAll()
      .antMatchers("/ui/login#/chDetail").authenticated();
</code>

应用程序其他层的代码sn-p如下,供参考。 Home.jsp 代码如下。

 <code>
  <body ng-app="bpApp" ui-view>
  <script type="text/ng-template" id="applicationPagelayout.html">
  <div class="grandContainer">  
    <div ui-view="header"></div>
    <div class="menuSecCT">
            <div ui-view="userStatus"></div>
            <div ui-view="menu"></div>
    </div>      
    <div class="mainContainer">
        <div ui-view="content"></div>
    </div>      
    <p ui-view="footer"></p> 
</div>
</script>
</body>
</code>

路由控制器代码如下。

<code>
 bpApp.config(['$stateProvider','$urlRouterProvider',function($stateProvider, $urlRouterProvider)  
$urlRouterProvider.otherwise('/login');

$stateProvider.state('root', 
    url: '',
    abstract:true,  
   views:       
        '': 
            templateUrl: 'applicationPagelayout.html'
        ,

        'footer@root': 
            templateUrl:'resources/html/footer.html'
        ,
        'header@root': 
            templateUrl:'resources/html/header.html'
        ,
        'userStatus@root': 
        templateUrl:'resources/html/userStatus.html'
        ,
        'menu@root': 
            templateUrl:'resources/html/menu.html'
                       
    

).state('root.chDetail', 
     url: "/chDetail",
     views:
          'content': 
     templateUrl: "resources/html/chDetail.html",
     controller: 'chDetailCtrl'
          
     
 ).state('login',  
     url: "/login",
     controller: 'loginCtrl',
     templateUrl: "resources/html/login.html"
 );
 ]);

</code>

web.xml 如下定义了 cxfservlet for REST 的 url 模式和 UI 的 Dispatcher servlet。

 <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
     <servlet-name>dispatcherservlet</servlet-name>
     <url-pattern>/ui/*</url-pattern>
   </servlet-mapping>

项目中只有springmvc控制器

 @Controller
 @RequestMapping("/login")
 public class ChController 

 @RequestMapping(method = RequestMethod.GET)
 public String getListingPage() 
      return "HomePage";
 
 

还有很多使用 Apache-cxf 的 RESTFUL API。 Spring data Mongo-db 用于 mongodb 上的 CRUD。

【问题讨论】:

【参考方案1】:

您需要将类似的内容添加到您的配置链中。

 http.httpBasic()
  .and()
  .authorizeRequests()
  .antMatchers("/root/ui/**").permitAll()
  .anyRequest().authenticated();

【讨论】:

我有一个 login.html,它的 url 模式为 localhost:8080/root/ui/login 或 localhost:8080/root/ui/login/#login 。所有其他应用程序页面位于以下 localhost:8080/root/ui/login#> 的 url。因此,如果我提供适用于所有 url 的 /root/ui**。因此它全部可访问或没有。

以上是关于使用 AngularJS 和 Spring Security 的单页应用程序中需要 AntMatchers的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS、Spring Social 和 CORS

使用 Spring Security、Jersey 和 AngularJS 验证表单

Angularjs 和 Spring 会话管理

使用 Spring MVC 和 AngularJS 的方法 DELETE

使用 AngularJS 配置 Spring MVC

使用AngularJS配置Spring MVC