Spring / Angular получить текущего пользователя и сохранить сообщение для этого пользователя - PullRequest
0 голосов
/ 28 октября 2019

Извините, я вернулся с еще одним вопросом. Я использую Spring Security и Angular Front End. У меня вопрос, как только я вхожу в систему, как мне сохранить сообщение для текущего пользователя.

Модель сообщения:

@Id
@GeneratedValue
private Long id;

private String title;

@Column(columnDefinition = "TEXT")
private String body;

@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss a", timezone = "America/New_York")
private Date createdAt;

private String pictureUrl;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user")
private User user;

UserDetailsServiceImpl:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository repository;

    @Override
    public UserDetails loadUserByUsername(String username) throws 
         UsernameNotFoundException {

         // Get the user's username
         User currentUser = repository.findByUsername(username);


    // Create a new UserDetails called user and set to user's :
    // username, current users password, user is enabled, account Non expired, creds non expired
    // account non locked,
    UserDetails user = new org.springframework.security.core.userdetails.User(username, currentUser.getPassword(),
            true, true, true, true,
            AuthorityUtils.createAuthorityList(currentUser.getRole()));


    return user;
}

}

Очевидно, что это хорошо работает с бегущиком командной строки:

Post post1 = new Post("Title", "Some content", date, user1);

Angular:

addPost() {
    const title = this.eventForm.get('title').value;
    const body = this.eventForm.get('body').value;


    const newTask: Task = {
        post,
        body
    };

    this.data.addPost(newPost).subscribe((res) => {
       console.log(res);
       this.getPost();
    });
}

Как я могу после входа получить фактический объект пользователя для сохраненияпочтовый объект.

Ответы [ 3 ]

1 голос
/ 29 октября 2019

Должен быть установлен фильтр, чтобы у вас была возможность записывать каждый запрос. В фильтре вы можете получить текущую информацию через SecurityContextHolder

Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
User user = (User) authentication.getPrincipal();

, если вы используете sprint-boot, вы можете обратиться сюда, чтобы добавить фильтр: https://www.baeldung.com/spring-boot-add-filter

0 голосов
/ 29 октября 2019

Понятия не имею, правильно ли это сделать, но это работает по крайней мере! Лол ... Пока что все работает, хаха.

@Autowired
private PostRepository repository;

@Autowired 
UserRepository userRepository;

@PostMapping("/posts")
public void addPost(@RequestBody Post post) {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    User user = userRepository.findByUsername(auth.getName());
    post.setUser(user);
    this.repository.save(post);
}
0 голосов
/ 29 октября 2019

У меня есть фильтр, просто когда я пытаюсь сохранить его для пользователя, я получаю обратно строку. Я думаю, мне нужно сделать пользовательский UserDetails? Пользователь класса реализует UserDetails? Что-то вроде того?

Вот мой фильтр:

public class AuthenticationFilter extends GenericFilterBean {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain 
filterChain)
        throws IOException, ServletException {

    Authentication authentication = 
    AuthenticationService.getAuthentication((HttpServletRequest)request);

    SecurityContextHolder.getContext().setAuthentication(authentication);

    filterChain.doFilter(request, response);
}

И пробую это ...

@PostMapping("/posts")
public void addPost(@RequestBody Post post) {
    Authentication authentication = 
    SecurityContextHolder.getContext().getAuthentication();
    User user = (User) authentication.getPrincipal();
    post.setUser(user);

    this.repository.save(post);
}

Я получаю это ...

java.lang.ClassCastException: java.lang.String cannot be cast to com.chad.familyblog.model.User

Возможно, я на правильном пути, просто создавая пользовательские детали?

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