Spring安全拦截网址不适用于单页面应用程序

时间:2017-04-17 12:50:26

标签: angularjs spring-security

这是我的春季安全文件:

<http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login" access="isAnonymous()" />
        <intercept-url pattern="/stat" access="hasRole('ROLE_USER')" />
        <intercept-url pattern="/articles" access="hasRole('ROLE_USER')" />
        <intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
        <form-login login-page="/index.html#/login"
            default-target-url="/index.html#/articles"
            authentication-failure-url="/index.html#/login?error"
            username-parameter="username" password-parameter="password" />
        <logout logout-success-url="/index.html#/login?logout" />
    </http>

这里我提到截取网址&#39; / **&#39;最后只是。

以下是我的web.xml:

<servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:dispatcher-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <!-- for spring security -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-security.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

但是我仍然遇到重定向问题,/ login和其他url模式没有被映射到处理程序上!

这是app.js:

searchApp.config([ '$routeProvider', function($routeProvider) {
    $routeProvider.when('/articles', {
        templateUrl : 'partials/articles-list-accordian.html',
        controller : 'ArticlesController'
    }).when('/login', {
        templateUrl : 'partials/login.html',
        controller : 'LoginControllers'
    }).when('/stat', {
        templateUrl : 'partials/job-stat.html',
        controller : 'JobStatController'
    }).otherwise({
        /*redirectTo : '/welcome'*/
        redirectTo : '/articles'
    });
} ]);

请在这里指导我,我是新手是春天安全,因此可能会犯一些愚蠢的错误..

1 个答案:

答案 0 :(得分:0)

有一个很好的教程可以使用AngularJS应用Spring安全性,这绝对不是一件容易的事,你必须在应用程序中做一些更改。

例如,建议使用httpBasic安全性而不是formLogin身份验证方法。您还需要使用HTTP标头将您的凭据发送到您的服务器,内容应该被编码。

你可以在这里阅读如何做到这一点:

https://spring.io/guides/tutorials/spring-security-and-angular-js/

我已成功使用指定的技术堆栈实现它,如果您需要进一步的帮助,请告诉我。