Логин не отображается после авторизации - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу, чтобы пользователь вошел в систему (авторизовался) в отображаемом меню заголовка с именем пользователя (логином), как на картинке.

enter image description here

Для этой цели у меня есть соответствующий код в angular:

Файл header.component. html:

<nav class="navbar">
  <a routerLink="" id="nav_logo">
    DishOnline
  </a>
  <div id="nav_right_section">
    <a routerLink="/loginPage">
      Вход
    </a>

    <button [hidden]=" receivedAnswer!==undefined && receivedAnswer!==null" mat-button [matMenuTriggerFor]="menu">{{receivedAnswer.login}}</button>
    <mat-menu #menu="matMenu">
      <button mat-menu-item>Мой кабинет</button>
      <button mat-menu-item>Выйти</button>
    </mat-menu>

  </div>
</nav>

Файл header.component.ts:

import {Component,OnInit } from '@angular/core';

import { LoginNameService} from '../services/loginName.service';
import {LoginName} from '../classes/loginName';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls : ['./header.component.scss'],

  providers: [LoginNameService]
})
export class HeaderComponent implements OnInit
{
  receivedAnswer: LoginName;

  loginNameObject: LoginName=new LoginName();


  constructor(private loginNameService: LoginNameService) {}
  submit() {
    this.loginNameService.postData()
      .subscribe((data: LoginName) => {},

        error => console.log(error)
      );
  }

  ngOnInit(): void {

    this.receivedAnswer=this.loginNameObject;
    this.submit();
  }

}

Я отправляю на сервер (backend - Spring Boot) пустой POST-запрос, используя для этого сервиса loginName.service.ts.

Файл loginName.service.t:

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


@Injectable()
export class LoginNameService {

  constructor(private http: HttpClient) { }

  postData() {

    // tslint:disable-next-line:prefer-const
    let baseUrl = 'http://localhost:8089';

    return this.http.post(baseUrl + '/loginName', null);
  }
}

Из сервиса у меня есть ответ в JSON:

{"login":"DishOnline"}

Но полученный логин не отображается в заголовке.

Код получения логина на бэкэнде (Spring Boot):

package com.greatproject.dishonline.controller;

import com.greatproject.dishonline.service.MyUserDetailsService;
import com.greatproject.dishonline.service.MyUserPrincipal;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.security.Principal;
import java.util.HashMap;
import java.util.Map;

@RestController
public class AuthorizationController {

    @RequestMapping("/loginName")
    public  @ResponseBody
    Map<String,String>  loginName(Model model,
                                  Authentication authentication,
                                  HttpSession session,
                                  MyUserPrincipal principal

    ) {
        String login = "";

        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        login = auth.getName(); //get logged in username

        Map<String, String> mapLoginName = new HashMap<String, String>();
        mapLoginName.put("login", login);

        return  mapLoginName;
    }

}

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете получить имя пользователя от принципала. Попробуйте добавить имя Model.user в модель и получить его таким образом в интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...