我正在做一个基于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登录并记住我吗?
您可以使用带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;
}
我还在开发Spring Angular2应用程序。在我的例子中,后端返回2个令牌(访问令牌和刷新令牌)。之后,我将“授权”添加到每个请求的标题中:“承载”this.access令牌。
您可以配置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