我有以下@RestContoller
可以登录:
@RequestMapping("/account/login")
@ResponseBody
@CrossOrigin(origins = "*", maxAge = 3600)
public Principal login(Principal principal) {
logger.info("user logged " + principal.getName());
return principal;
}
我有一个来自Angularjs应用程序的客户端的以下请求。
Accept: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,fa;q=0.8,it;q=0.7
Authorization: Basic bWVocmRhZGFsbGFoa2FyYW1pQGdtYWlsLmNvbTptZWhyZGFk
Connection: keep-alive
DNT: 1
Host: localhost:8080
Origin: http://localhost:4200
Referer: http://localhost:4200/login
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36
但是我得到200
的响应,服务器打印null
,而客户端得到错误的响应:
HttpErrorResponse {headers: HttpHeaders, status: 400, statusText: "OK", url: "http://localhost:8080/account/login", ok: false, …}error: {timestamp: 1540136257516, status: 400, error: "Bad Request", exception: "org.springframework.web.bind.ServletRequestBindingException", message: "Missing request header 'header' for method parameter of type Header", …}headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}message: "Http failure response for http://localhost:8080/account/login: 400 OK"name: "HttpErrorResponse"ok: falsestatus: 400statusText: "OK"url: "http://localhost:8080/account/login"__proto__: HttpResponseBase
任何人都可以帮助我知道我哪里做错了吗?以前可以使用,但是我在Angular中使用了拦截器,但现在无法使用了。
我的登录控制器是:
@Injectable()
export class AuthService {
constructor(public http: HttpClient, public auth: InterceptorAuthService) {
}
public logIn(user: User) {
this.auth.setUser(user);
return this.http.get(AppComponent.API_URL + "/account/login")
.pipe(
map(response => {
// login successful if there's a jwt token in the response
let user = response;// the returned user object is a principal object
if (user) {
// store user details in local storage to keep user logged in between page refreshes
localStorage.setItem('currentUser', JSON.stringify(user));
}
},
catchError(error => {
return Observable.throw(error);
})
));
}
}
WebConfig.java配置:
// This method is used for override HttpSecurity of the web Application.
// We can specify our authorization criteria inside this method.
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
// ignoring the guest's urls "
http.antMatcher("/account/**").authorizeRequests().anyRequest().authenticated().and()
.antMatcher("/token").authorizeRequests().anyRequest().authenticated()
.antMatchers("/logout").permitAll()
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
.httpBasic();
// authenticate all remaining URLS
// @formatter:on
}
答案 0 :(得分:1)
尝试在要显示用户名的“ / account / login”模板中添加sec:authorize="isAuthenticated()
例如:
<h3 sec:authorize="isAuthenticated()" th:text="${user.username}"></h3>
如果它已经发生,它将获得认证状态,否则,它不会显示<h3>
代码块。
答案 1 :(得分:0)
@Component
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
@Override
public void afterPropertiesSet() throws Exception {
setRealmName("Baeldung");
super.afterPropertiesSet();
}
@Override
public void commence(
HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
throws IOException, ServletException {
response.addHeader("WWW-Authenticate", "Basic realm="" + getRealmName() + """);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
PrintWriter writer = response.getWriter();
writer.println("HTTP Status 401 - " + authEx.getMessage());
}
}
// inside filter we can get the
SecurityContextHolder.getContext().getAuthentication().getPrincipal()