Spring Security和AngularJS路由之间的冲突

时间:2015-12-02 15:33:24

标签: javascript java angularjs spring spring-security

我目前在angularJS路由和Spring Security默认登录表单之间存在冲突时遇到问题。如果我将一个角度路由作为登录页面,它不喜欢它,似乎开始无限重定向循环。

的index.html

<html ng-app='storeApp'>
<head>
<meta charset="ISO-8859-1">
<title>Online Shopping System</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>

    <div class="container" ng-controller="testCtrl as tVm">
        {{authenticated}}
        <ul class="nav nav-pills" role="tablist">
            <li class="active"><a href="#/">Home</a></li>
            <li><a href="#/customer">Login</a></li>
            <li ng-show="authenticated"><a href="" ng-click="tVm.logout()">Logout</a></li>
        </ul>
    </div>
    <div class="container-fluid" ng-view></div>

</body>

<script src="https://code.angularjs.org/1.4.7/angular.min.js"></script>
<script src="https://code.angularjs.org/1.4.7/angular-route.min.js"></script>
<script src="https://code.angularjs.org/1.4.7/angular-resource.min.js"></script>
<script src="app.js"></script>
<script src="customers.js"></script>
<script src="products.js"></script>
</html>

在customers.js中的客户页面路由

 angular.module('storeApp').config(['$routeProvider', '$httpProvider', function($routeProvider, $httpProvider){
        $routeProvider.
        when("/customer", {
            templateUrl: "/customer.html"
            //controller: 'customerCtrl',
            //controllerAs: 'vm'
        }).
        otherwise({
            redirectTo: '/main'
        });

        $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';

    }]).controller('customerCtrl', customerCtrl);

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/", "/customer.html", "/index.html", "/main.html", "/*.js", "/user", "/logout").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/customer.html")
                .permitAll()
                .and()
            .httpBasic()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }
}

.formLogin()
                    .loginPage("/customer.html")
                    .permitAll()
                    .and()

是我遇到问题的地方。

当用户尝试访问需要在角度页上登录的页面时,它可以正常工作并重定向到正确的路由,我将其作为/#/ customer。但是,当您尝试访问不在匹配器中的非角度页面时,/ asdfasdf,它将转到原始html页面,而不是角度路径。

我想知道的是,有没有办法让WebSecurityConfig使用角度路由?如果没有,解决这个问题的方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为您可以在web.xml中配置类似于将未找到的页面路由到现有页面的内容,例如登录页面

<error-page>
  <error-code>404</error-code>
  <location>/index.html</location>
</error-page>