장바구니 속성이있는 사용자 지정 UserDetails
구현이 있습니다.스프링 보안 게스트 사용자
class MyUserDetails implement UserDetails {
private Cart cart;
// getters & setters + other properties....
}
나는 지금까지 내가 그렇지 않으면 작업을 입수했습니다, 익명의 사용자가 너무 MyUserDetails의 인스턴스를되고 싶어하지만, 모든 anonymousUsers 같은 쇼핑 카트를 가지고!
@Override
protected void configure(HttpSecurity http) throws Exception {
MyUserDetails anonymousUser = new MyUserDetails();
anonymousUser.setUsername("anonymousUser");
http.anonymous().principal(anonymousUser);
...
}
나는 각 세션에 대한 익명 사용자
에 대한 MyUserDetails의 새로운 인스턴스를 반환 할 수있을 것 어떻게 ?
public class MyAnonymousAuthenticationFilter extends AnonymousAuthenticationFilter {
private static final String USER_SESSION_KEY = "user";
private final String key;
public MyAnonymousAuthenticationFilter(String key) {
super(key);
this.key = key;
}
@Override
protected Authentication createAuthentication(HttpServletRequest req) {
HttpSession httpSession = req.getSession();
MyUserDetails user = Optional.ofNullable((MyUserDetails) httpSession.getAttribute(USER_SESSION_KEY))
.orElseGet(() -> {
MyUserDetails anon = new MyUserDetails();
anon.setUsername("anonymousUser");
httpSession.setAttribute(USER_SESSION_KEY, anon);
return anon;
});
return new AnonymousAuthenticationToken(key, user, AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS"));
}
}
와 다음이 방법에 문제가있을 경우 http.anonymous().authenticationFilter(new MyAnonymousAuthenticationFilter(UUID.randomUUID().toString()));
와 함께 사용하거나 :
나는 글쓰기 방법이 세션에서 장바구니를 갖는 것이라고 말하고 싶다. 귀하의 인증에는 장바구니가 필요하지 않습니다. 'UserDetails'는 핵심 사용자 정보 만 포함해야합니다. – dur
@ dur 장바구니는 사용자에게 속해 있다고 생각합니다. 예를 들어 등록 된 사용자 장바구니가 로그인간에 또는 다른 장치간에 유지되기를 원한다면 – Mico
물론 사용자의 일부이지만 'UserDetails'의 일부 여야한다는 의미는 아닙니다. 장바구니를 세션에 넣거나 데이터베이스에서로드 할 수 있습니다. 그건'UserDetails'와는 아무런 관련이 없습니다. – dur