2013-04-13 2 views
0

현재 스프링 웹 애플리케이션에 로그인 메커니즘을 구현하려고하고 있는데 봄에 사용되는 보안 개념에 대해 약간 혼란스러워합니다.봄에 보안 세션. 로그인 유지

로그인이 필요한 페이지에 액세스하면 로그인 페이지로 올바르게 리디렉션됩니다. 로그인 후 실제 페이지가 표시됩니다 (현재까지는 양호 함). 나는 다시 동일한 페이지에 액세스하는 경우이

<security:http use-expressions="true" auto-config="true"> 
    <security:intercept-url pattern="/login" access="permitAll" /> 
    <security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
     <security:form-login login-page="/login" default-target-url="/welcome" 
      authentication-failure-url="/loginfailed" /> 
     <security:logout logout-success-url="/logout" /> 
     <security:remember-me/> 
    </security:http> 

에 대한

코드 그러나, 나는 다시 로그인 할 필요가있다. 보안 세션이 필요합니다. 나는 이미 기억과 세션 관리에 관해 많은 것을 시도했지만 읽는 법을 알 수 없었다.

봄의 문서 나 키워드에 적절한 지침을 줄 수 있습니까?

로그인 양식

<form name='f' action="<c:url value='j_spring_security_check' />" 
     method='POST'> 

     <table> 
      <tr> 
       <td>User:</td> 
       <td><input type='text' name='j_username' value=''> 
       </td> 
      </tr> 
      <tr> 
       <td>Password:</td> 
       <td><input type='password' name='j_password' /> 
       </td> 
      </tr> 
      <tr> 
       <td colspan='2'><input name="submit" type="submit" 
        value="submit" /> 
       </td> 
      </tr> 
      <tr> 
       <td colspan='2'><input name="reset" type="reset" /> 
       </td> 
      </tr> 
     </table> 

    </form> 

당신은 conf의 파일에 보안 정의를이해야

@RequestMapping(value="/login", method = RequestMethod.GET) 
    public String login(ModelMap model) { 

     return "login"; 

    } 

    @RequestMapping(value="/loginfailed", method = RequestMethod.GET) 
    public String loginerror(ModelMap model) { 

     model.addAttribute("error", "true"); 
     return "login"; 

    } 

    @RequestMapping(value="/logout", method = RequestMethod.GET) 
    public String logout(ModelMap model) { 

     return "login"; 

    } 

답변

1

LoginController.java :

<security:remember-me services-alias="rememberMeService" data-source-ref="dataSource" user-service-ref="userService"/> 
</security:http> 

을하고 persistnet 로그인 테이블을 생성

,471,574,613,

하지만 이제 설정이 잘 보이기 때문에 보안 세션, 로그인 후 두 번째 요청 유지되지 않는 이유 그것은 매우 신비 년대 Official docs

+0

안녕 님, 사용자가 (긴) 동안 웹 페이지로 돌아 가면 유스 케이스에 대해 기억하지 못합니까? 내가 필요한 것은 사용자가 한 번만 인증 한 다음 웹 앱 (화면으로 화면 이동)으로 작업 할 수 있어야한다는 것입니다. 이것은 동일합니까? 그렇다면 실제로이 테이블을 유지해야합니까? 로그인 한 사용자 데이터를 서버 캐시에 유지하는 것이 가능하지 않습니까? –

+0

@GreenLomu 예 rememeber-me는 세션이 종료되었을 때를 나타냅니다. 봄 장소는 세션 자동 ... – NimChimpsky

+0

에 principial 로그인 및 어떻게 사용자가 이미 인증 체크 할 경우 유효한 세션을 가지고? 이것은 에서 어떻게 든 다루어 졌습니까? –

1

을 반복하고있다. 일부 로그는이 문제를 해결하는 데 유용합니다. org.springframework.security에 추적 레벨 로깅을 사용 가능하게하고 문제점을 재현 한 후에 로그를 공유하십시오.

의견은 지금까지 말하기에 충분했지만 메모미 기능의 구성과 사용법을 명확히하고 싶었습니다. 거기에 문제가 너무 있었기 때문입니다.

remember-me 서비스는 원래 질문에있는 간단한 구성으로 작동해야합니다. 을 <remember-me>에 지정하지 않았으므로보다 간단하고 덜 안전한 구현이 적용되어 클라이언트에 발급 된 토큰이 유지되지 않습니다.

data-source-ref을 구성하면 사용자의 기억 나 토큰 (쿠키)이 도난 당했을 때 사용자에게 경고하고 사용자가 로그인 할 때 경고 메시지를 표시 할 수 있습니다. 사이트에 사용자의 신원을 표시합니다. 이것은 추가 노력을 투자하는 것을 고려할만큼 충분히 가치가 있습니다.

지금 중요한 것은 다음 기억 - 나 서비스의에서 문서화 기능은 클라이언트가 명시 적으로 이름 _spring_security_remember_me으로 요청 매개 변수를 보내 자신의 로그인을 기억하기 위해 서버를 요구한다는 것이다. 따라서 로그인 양식에 다음 스 니펫과 같은 것을 삽입해야합니다.

<p> 
    <label for="_spring_security_remember_me">Remember-me</label> 
    <input id="_spring_security_remember_me" 
      name="_spring_security_remember_me" type="checkbox"/> 
</p> 

remember-me 서비스는 이것 없이는 아무 것도하지 않습니다.(완벽을 기하기 위해 : remember-me 서비스에 alwaysRemember 플래그를 설정하는 다른 옵션이 있지만이 구성 포인트가 보안 네임 스페이스에 노출되지 않기 때문에 약간 불편 함)