AntMatchers在使用AngularJS和Spring Security的SinglePage应用程序中需要

时间:2016-05-06 18:20:00

标签: angularjs rest spring-mvc spring-security

我有一个单页应用程序客户端使用AngularJS而服务器端使用Spring MVC,REST,Spring Data。当应用程序部署时,spring mvc呈现一个JSP页面,该页面具有多个名为ui-view的角度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文件中尝试下面的代码,以允许在没有身份验证的情况下呈现登录页面。在浏览器访问之前,必须对其他页面进行身份验证。登录页面应该是应用程序的唯一入口点。但是这段代码不起作用。 请指教。

注意: - 这是单页应用程序。 App只有一个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>

该应用程序其他层的代码片段如下所示,以供参考。 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如下所示,为REST和cxfservlet定义了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数据Mongo-db用于mongodb上的CRUD。

1 个答案:

答案 0 :(得分:1)

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

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