우쵸
68
2021-02-09 20:14:32
5
217

[Spring] 시큐리티, 로그인 질문드립니다


프로젝트 진행중인데 처음이다보니 어려움이 많네요ㅠ  도움 요청드립니다!

스프링으로 로그인, 후기게시판 구현 중에 있습니다 

제가 하고 싶은 것은 로그인 정보가 없는 유저도 후기리스트 게시판까지

접근할 수 있도록 만들고 싶어요. 이후 후기를 작성하려고 하면(버튼을 누르면)

로그인페이지로 이동하도록 구현하고 싶습니다.

로그인은 시큐리티로 구현했습니다.


현재 로그인 없이 테스트를 하면 정상 작동합니다. 

후기리스트도 잘 나오고 후기 작성하기 버튼을 누르면 로그인 페이지로 이동합니다.

그런데 로그인을 하고 테스트를 하면 후기리스트는 잘 나오는데

후기 작성하기를 누르면 500번 에러 부적합한 열 : 1111 이 뜹니다.


제가 생각하기에는 후기리스트 페이지에서 후기 작성하기 페이지로 넘어갈 때

emailAddress 정보가 없어서 생기는 에러 같습니다.  (프로젝트의 유저 id가 emailAddress 입니다)

그렇다고 후기리스트 페이지에 시큐리티 emailAddress 정보를 넣으면

로그인 없이는 접근이 안되는 상황입니다. (둘 중 하나만 되는 상황입니다)


[security-context.xml]




[review.jsp] : 후기리스트




[reviewRegister.jsp] : 후기작성(등록)




[500번 에러]




어떻게 하면 시큐리티의 유저정보를 조건부로 가지고 올 수 있을까요?

로그인 상태에서는 가져와서 전달하고

비로그인 상태에서는 아예 사라지고 이렇게요

review.jsp 에서 주석처리 되어있는

<input type='hidden' name='emailAddress' value='<sec:authentication property="principal.username"/>'>

이 부분의 주석을 풀면 거꾸로 로그인 상태에서는 잘 작동하고

비로그인 상태에서는 후기리스트 페이지에서 오류가 납니다. 저 부분에서요.


제가 설명을 잘 한건지 모르겠는데요..

어떻게 풀어야할 지 힌트라도 부탁드립니다!


0
  • 답변 5

  • 북극곰은콜라
    40
    2021-02-10 02:58:03

    제가 잘 이해한건지 모르겠지만

    클라이언트 단으로 유저정보를 관리하고 싶다면

    1. 직접 해당 유저정보를 response

    2. 필터를 확장하여 인증정보 관리 (시큐리티 쪽)

    3. 클라이언트단에서 쿠키로 인증정보관리

    4. 토큰방식을 이용해 클라이언트단에서 필요할때 유저정보 따로 요청 (ajax등)

    정도 생각납니다.

  • 우쵸
    68
    2021-02-10 09:19:49

    감사합니다! 다시해보겠습니다

  • CD9K1
    401
    2021-02-10 10:13:35

    시큐리티를 수정하면 되지않을까요??
    후기리스트는 모든유저가 접근가능하고

    후기작성은 로그인유저만 접근가능하게 처리하면될거같은데요



  • CD9K1
    401
    2021-02-10 10:22:34

    후기리스트 페이지에서 유저정보가  필요한이유가 뭔가요??

  • 퀘이사123
    552
    2021-02-10 11:11:41

    후기리스트페이지 => permitall

    후기작성 => 로그인한유저만 허용


    해놓으시면 후기작성버튼을 누르면 로그인페이지로 들어갈겁니다.


    거기서 로그인을 하면 후기작성페이지로 이동하게되죠.

    (로그인안한 사용자가 url요청시 로그인페이지로 넘어가고 해당 url은 세션에 저장되어있어서 로그인을 성공하면 해당 url로 리다이렉트 시키게 됩니다. spring에선 이걸 직접 custom해야하는지는 모르겟네요. spring boot에서는 디폴트로 설정되어있는거라.)


    그럼 후기작성 controller에서 로그인한 유저를 파라미터로 받고

    (

    후기삭정(@AuthenticationPrincipal User user)

    이렇게

    )


    그 유저의 아이디를 뽑아서 쓰면 문제없을거같은데요.

    유저아이디 = user.getUsername();

  • 로그인을 하시면 답변을 등록할 수 있습니다.