当前位置: 首页 > 知识库问答 >
问题:

AngularJS Spring security Memory me功能

彭霄
2023-03-14

我正在做一个基于spring boot Angularjs身份验证的应用程序,我在这篇博文中写道:https://spring.io/guides/tutorials/spring-security-and-angular-js/所以我启用了基本用户/密码或OAuth2

我想为它添加Remmeber me功能。我有自己的服务

AuthService.authenticate = function (credentials, callback) {
    var headers = credentials ? {
        authorization: "Basic "
        + btoa(credentials.username + ":" + credentials.password)
    } : {};

    $http.get('api/user/', {headers: headers}, {timeout: 5000}).then(
        function (response) {
            var data = response.data;
            if (data.id) {
                $rootScope.authenticated = true;
                $rootScope.principal = data;
                $translate.use($rootScope.principal.language);
                $location.search('lang', $rootScope.principal.language);
                AvatarService.getUserAvatar($rootScope.principal);
                $log.debug("[DEBUG] User logged in " + $rootScope.principal.id);
            } else {
                $rootScope.authenticated = false;
            }
            callback && callback();
        },
        function () {
            $rootScope.authenticated = false;
            callback && callback();
        });
};

在登录控制器中,我用:

$scope.credentials = {};
//LOGIN
$scope.login = function () {
    AuthService.authenticate($scope.credentials, function () {
        if ($rootScope.authenticated) {
            $location.path("/");
            AlertService.clearAlerts();
        } else {
            $location.path("/login");
            AlertService.addError('user.login.failed');
        }
    });
};

在Spring Security上,我像往常一样设置了它,(配置的一部分)

            ....
            .and().formLogin()
                .loginPage("/#/login")
                .and().rememberMe()
                .rememberMeServices(rememberMeServices())
                .key("remember-me-key")
            .and().addFilterBefore(new CsrfHeaderFilter(), CsrfFilter.class)
                .csrf()
            ....

但我猜应该是记得我而不是基本的授权

如何调整它以使用“记住我”?我能用j_用户名j_密码通过post执行call登录并记住我吗?

共有3个答案

董权
2023-03-14

您可以使用带Angular和基本身份验证的Spring记住我服务,您必须随帖子发送记住我参数。

下面是Angular2的一个例子:

import {Injectable} from "@angular/core";
import {HttpClient, HttpHeaders, HttpParams} from "@angular/common/http";

import {Observable} from "rxjs/Observable";
import {CSRF_URL, LOGIN_URL, LOGOUT_URL} from "./auth.constant";

export interface RespAccess {
  email?: String;
  name: string;
  permissions: [string];
}

@Injectable()
export class AuthenticationService {

  constructor(private http: HttpClient) {}

  login(username: string, password: string, rememberme: boolean): Observable<RespAccess> {
    let headers = new HttpHeaders();
    headers = headers.append('Authorization', 'Basic ' + btoa(username + ':' + password));
    headers = headers.append('X-Requested-With', 'XMLHttpRequest'); // to suppress 401 browser popup

    const params = new HttpParams().append('remember-me', (rememberme ? 'true' : 'false' ));
    return this.http.post<RespAccess>(LOGIN_URL,'', {headers, params});
  }

  logout() : Observable<any> {
    return this.http.post<any>(LOGOUT_URL, '');
  }

  getCSRFToken() {
    this.http.get<any>(CSRF_URL) // /api/auth/csrf
      .subscribe();
  }
}

如果您使用的是CSRF保护,则必须在登录前获得CSRF令牌。您只需访问一个返回令牌的不安全url就可以做到这一点,以下是Spring服务器端控制器中的方法:

@RequestMapping("/api/auth/csrf")
public CsrfToken csrf(CsrfToken token) {
    return token;
}
韩琛
2023-03-14

我还在开发Spring Angular2应用程序。在我的例子中,后端返回2个令牌(访问令牌和刷新令牌)。之后,我将“授权”添加到每个请求的标题中:“承载”this.access令牌。

林博厚
2023-03-14

您可以配置Spring启动服务器来向客户端发出身份验证令牌。在客户端(Angular),将令牌保存在某个地方(本地存储/cookie)。然后您可以在应用程序首次加载时检查令牌的存在。JWT令牌在处理网络客户端身份验证时非常好。

例如,如果我的安全配置文件中有这段代码。

.authorizeRequests()
    .antMatchers("/", "/index.html", "/login.html", "/home.html").permitAll()
.anyRequest()
.authenticated().and()
.formLogin()
    .successHandler(authenticationSuccessHandler)
    .failureHandler(authenticationFailureHandler)

我可以轻松实现authenticationSuccessHandler,并在成功登录后向用户发回身份验证令牌或身份验证cookie,或两者都发回。

public class AuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

... bla bla bla

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication ) throws IOException, ServletException {
    clearAuthenticationAttributes(request);
    User user = (User)authentication.getPrincipal();

    String jws = tokenHelper.generateToken( user.getUsername() );

    // cookie in response
    Cookie authCookie = new Cookie( TOKEN_COOKIE, ( jws ) );
    authCookie.setPath( "/" );
    authCookie.setHttpOnly( true );
    authCookie.setMaxAge( EXPIRES_IN );
    response.addCookie( authCookie );
    // token in response
    UserTokenState userTokenState = new UserTokenState(jws, EXPIRES_IN);
    String jwtResponse = objectMapper.writeValueAsString( userTokenState );
    response.setContentType("application/json");
    response.getWriter().write( jwtResponse );
}

}

更多细节可以在springboot jwt starter中找到。这是一个使用spring boot和AngularJS的初学者工具包项目。

如果您想使用Angular实现Spring Boot安全性,The Login Page: Angular JS和Spring Security Part II系列是非常好的阅读材料。

 类似资料:
  • 问题内容: 我正在使用Ajax发布将表单数据提交到服务器,进行验证,然后根据数据是否有效并可以存储返回一条消息。我的ajax帖子中的成功功能没有运行。这是ajax帖子和成功消息的显示: 标签上没有显示任何消息。我尝试在代码中将successmessage变量设置为一个设置值,并且显示效果很好,所以成功函数一定存在问题,我看不到什么?我也尝试设置错误回调,如下所示: 但是仍然没有消息显示。 问题答案

  • 问题内容: 这段代码的结果为56。 知道里面发生了什么吗?我很困惑。 问题答案: X返回(值+3),而Y返回(值* 2) 给定值为4,这表示。 尽管函数不受范围限制(这意味着您可以安全地“嵌套”函数定义),但是此特定示例容易出错: 1)您不能在调用 之前先调用,因为函数只有执行一次才真正定义。 2)调用两次将导致PHP重新声明function ,从而导致致命错误: 致命错误:无法重新声明y() 两

  • 对非常基础的使用来说,使用 Vite 开发和使用一个静态文件服务器并没有太大区别。然而,Vite 还通过原生 ESM 导入提供了许多主要用于打包场景的增强功能。 NPM 依赖解析和预构建 原生 ES 引入不支持下面这样的裸模块导入: import { someMethod } from 'my-dep' 上面的操作将在浏览器中抛出一个错误。Vite 将在服务的所有源文件中检测此类裸模块导入,并执

  • Emmet allows you to write large HTML code blocks at speed of light using well-known CSS selectors. But it’s not the only thing that every web-developer needs: occasionally you have to edit your HTML a

  • 问题内容: 我用用,并尝试设置默认目录文件下载。 我在文档中找到了这个: 请改用ChromeDriver(ChromeOptions)。创建一个新的ChromeDriver实例。该功能将传递给chromedriver服务。 问题答案: 我希望您想问一下解决方法,以避免过时。 不推荐使用仅与一起构建的旧方法。现在,它以&为参数。因此,只需构建一个,然后将其与您一起传递即可删除弃用警告。 编辑: 由于

  • 问题内容: 我正在一个网站上,我们从XML文件中获取信息。效果很好,但是现在我需要对内容进行滑动。为此,我将使用jCarousel声明它们可以通过调用回调函数来处理动态加载的内容。 但是,当我成功调用函数时,无法进行初始的ajax加载。我究竟做错了什么? 我做错什么了吗?还是我必须去一个完全不同的地方?:-) 问题答案: 使用hulabula代替hulabula()或将函数直接传递给ajax选项:

  • 问题内容: 我的问题与jQuery方法有关。我无法使用成功参数。 这有效: 这不是: 在第一种情况下,我得到一个JavaScript警报窗口,该窗口使我知道调用的函数正在工作。我在第二个代码块中所做的所有更改都放在了。 这样做的目的是验证$ .ajax是否正在运行,以便在$ .ajax成功运行时可以在其中放置一些实际有用的代码。 问题答案: 在第二个示例中,除非您从服务器成功回电,否则将不会发生任

  • 实现点击工具栏中“+”号扩展区域内添加自定义事件,比如添加“最近订单”、“最近商品”: 注:图片需要添加到SDK中对应bundle资源文件中 /** @return 扩展内容 例如: @[@{@"picName": @"图片-(1)",@"highLightPicName": @"图片hover",@"name": @"图片1"}, @{@"picName": @"图片-(1)",@"highLi