2017-11-17 4 views
1

장바구니 속성이있는 사용자 지정 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()));

와 함께 사용하거나 :

+1

나는 글쓰기 방법이 세션에서 장바구니를 갖는 것이라고 말하고 싶다. 귀하의 인증에는 장바구니가 필요하지 않습니다. 'UserDetails'는 핵심 사용자 정보 만 포함해야합니다. – dur

+0

@ dur 장바구니는 사용자에게 속해 있다고 생각합니다. 예를 들어 등록 된 사용자 장바구니가 로그인간에 또는 다른 장치간에 유지되기를 원한다면 – Mico

+1

물론 사용자의 일부이지만 'UserDetails'의 일부 여야한다는 의미는 아닙니다. 장바구니를 세션에 넣거나 데이터베이스에서로드 할 수 있습니다. 그건'UserDetails'와는 아무런 관련이 없습니다. – dur

답변

1

나는 그것을 이렇게 정의 AnonymousAuthenticationFilter를 작성하여 작업 얻을 관리 확신 더 나은 방법을 알고 있다면 알려주세요.

+0

사용자는 항상 익명으로 처리됩니까? 또는 특정 URL 패턴에 대해? – jdc91

1

내 첫 발언은 내가 @dur의 의견에 동의하는 경향이 있다는 것입니다하지만 난 그게 봄 아키텍처 더 인라인있을 거라고 생각 당신은 여전히 ​​당신의 접근 방식에 충실하려는 경우 그

:-) 또 다른 이야기 필터 대신에 AuthenticationProvider을 구현하면 익명의 토큰을 처리 (인증) 할 수 있습니다. 이처럼 :

public class MyAuthenticationProvider implements AuthenticationProvider { 

    @Override 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 

    //enrich the authentication here. 
    } 


    @Override 
    public boolean supports(Class<?> authentication) { 
    return (AnonymousAuthenticationToken.class 
     .isAssignableFrom(authentication)); 
    } 
} 

그러면 예를 들어, WebSecurityConfigurerAdapter에 의해 초기화 될 수 필터 체인에이 공급자를 등록합니다. 로컬 인증 관리자를 구성하여이 작업을 수행 할 수 있습니다. 이것은 다음과 같이 어떻게 든 모양 :

@Override 
protected void configure(
    AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(new MyAuthenticationProvider()); 
} 

here를 참조하십시오 봄 보안 아키텍처의 뛰어난 심도있는 검토를 위해.