Spring 安全性和 Angular javascript 重定向到登录页面

Posted

技术标签:

【中文标题】Spring 安全性和 Angular javascript 重定向到登录页面【英文标题】:Spring security and angular javascript redirect to login page 【发布时间】:2014-04-14 14:42:45 【问题描述】:

您好,我遇到了 spring security+Spring MVC+angular javascript 的问题。当会话无效时,我想请求(整个)页面重定向到登录页面。

我试过<session-management invalid-session-url="/login" /> 但它不能工作,因为它是一个单页应用程序......

或任何在 Angular javascript 单页应用程序中处理 sessiontimeout 的建议

有什么帮助吗?

【问题讨论】:

【参考方案1】:

您可以编写或使用HTTP interceptors 这样的https://github.com/witoldsz/angular-http-auth 来捕获超时问题。

基本上当会话过期时,任何服务器请求开始返回 401,可以使用 HTTP 拦截器捕获并执行必要的重定向。

【讨论】:

【参考方案2】:

我编写了一个简单的代码来检查会话超时并重定向到登录页面以实现 Spring 安全性。 这不是一个聪明的解决方案,但返回的状态是 200 并且响应不包含重定向信息。

var app = angular.module("app");
app.factory("sessionInjector", ['$log', function($log)
    return 
        request: function(config) return config;,
        response: function(response) 
            if (typeof response.data === "string" && response.data.indexOf("login") > -1) 
                alert("Session expired.");
                location.reload();
            
            return response;
        
    ;
]);
app.config(["$httpProvider", function($httpProvider)
    $httpProvider.interceptors.push("sessionInjector");
]);

【讨论】:

【参考方案3】:

我已经通过简单的配置解决了这个问题,在 Spring Security 端,在 angularjs 端使用 Http Interceptor:

Spring 安全配置:

@Override
protected void configure(HttpSecurity http) throws Exception 
  http
    .csrf()
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
  .and()
     .authorizeRequests()
        .antMatchers("/somePage").hasRole("SOME_ROLE")
  .and()
      .formLogin()
  .and()
     .authorizeRequests()
        .antMatchers("**/api/**").hasRole("SOME_ROLE")
        .anyRequest().authenticated()
  .and()
    .httpBasic()
  .and()
    .logout()
      .invalidateHttpSession(true)
      .logoutSuccessUrl("/login")
    .and()
      .sessionManagement()
         .maximumSessions(1);

  

@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() 
      return new HttpSessionEventPublisher();

angularjs 代码:

app.config(['$httpProvider',
    function ($httpProvider) 
        $httpProvider.interceptors.push('httpInterceptor');
        ...
    ])

app.factory("httpInterceptor", ["$q", "$window", "$log",
function ($q, $window, $log) 
    return 
        responseError: function(response) 
            switch (response.status) 
            case 401:
            case 403:
                $window.location.reload();
                return;
            
        
    
]);

将 formLogin() 用于页面,将 httpBasic() 用于 API 调用 除了管理会话之外,当您访问站点页面时,您将被重定向到登录页面,并且会在未经身份验证的 API 调用上获得 401 状态代码,这可以被 Angular 的拦截器捕获,然后您可以重新加载页面或执行任何操作需要做的

希望这会有所帮助:)

【讨论】:

以上是关于Spring 安全性和 Angular javascript 重定向到登录页面的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rest 和 Spring 安全性通过 ldap 登录 Angular?

Spring 安全性和 Angular javascript 重定向到登录页面

在 Jersey 和 Spring SAML 安全 SSO 验证之后路由到 Angular 组件

为 Angular 2 配置 Spring 安全性

如何在本地主机上启用 Spring 和 Angular 2 之间的 CORS

无法理解 JWT 和 Java (Spring Boot)。这个应用程序安全吗?