2010-03-07 2 views
2

저는 스프링 MVC [버전 : 2.5]와 보안 [버전 : 2.0.4]을 사용합니다.spring-security wrong logged logged user

내 문제는 다음과 같습니다

사용자 A의 로그인 및 암호를 사용하여 내 응용 프로그램에

먼저 로그인 -> 확인

로그 아웃 사용자 A, 사용자 B가에서 로그인입니다

사용자 B의 로그인 + 암호 작품. 좋아요, 앱에 있는데 UserB ROLE이 켜져 있습니다. [관리자가 아닌 경우 관리자 세션에 액세스 할 수 없음]

userejb.findUserByUsername(SecurityContextHolder.getContext().getAuthentication().getName());

내 사용자가 아닌 사용자 B하지만 사용자 A는 ...

내가 그것을 어떻게 를 해결할 수

:

나는 로그인 사용자에 대해, 데이터베이스에서 데이터를 얻기 위해이 코드를 사용할 수 있습니까? 내가 뭘 잘못 했니?

내 보안 구성 :

<bean id="userDetailsService" class="pl.tzim.jlp.security.CustomUserDetailsServiceImpl" /> 
<http auto-config='true'> 
    <!-- login panel dostepny dla wszystkich chetnych!--> 
    <intercept-url pattern="/login.action" filters="none"/> 
    <intercept-url pattern="/index.jsp" filters="none"/> 
    <intercept-url pattern="/CS/**" filters="none" /> 
    <intercept-url pattern="/JS/**" filters="none" /> 
    <intercept-url pattern="/grafiki/**" filters="none" /> 
    <intercept-url pattern="/free/**" access="" /> 
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN"/> 
    <intercept-url pattern="/teacher/**" access="ROLE_TEACHER, ROLE_ADMIN"/> 
    <intercept-url pattern="/all/**" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN"/> 
    <intercept-url pattern="/student/**" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN"/> 
    <intercept-url pattern="/login/**" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN" /> 
    <intercept-url pattern="/*" access="ROLE_STUDENT, ROLE_TEACHER, ROLE_ADMIN" /> 
    <form-login login-page='/free/login.action' authentication-failure-url="/free/login.action?why=error" default-target-url="/free/index.action"/> 
    <logout logout-success-url="/free/login.action?why=logout"/> 
    <concurrent-session-control max-sessions="99" exception-if-maximum-exceeded="true"/> 
</http>  
<authentication-provider user-service-ref='userDetailsService' /> 

내 loginUser 클래스 및 방법 :

@SessionAttributes(types = {CustomUser.class}, value = "{logedUser}") 
public class CustomUserDetailsServiceImpl implements UserDetailsService { 
    @Autowired 
    public UserDAO userdao; 
    public CustomUser logedUser; 
    @Transactional(readOnly = true) 
    @Override 
    public CustomUser loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
     try { 
      pl.tzim.jlp.model.user.User user = this.userdao.findUserByUsername(username); 
      String password = user.getPassword(); 
      String role = user.getAuthority().getRolename(); 
      boolean enabled = true; 
      logedUser = new CustomUser(user.getId(), username, password, enabled, new GrantedAuthority[]{new GrantedAuthorityImpl(role)}); 
      return logedUser; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

public class CustomUser extends User{ 
    private Long id; 
    public CustomUser(Long id, String username, String password, boolean isEnabled, GrantedAuthority[] authorities){ 
     super(username, password, isEnabled, true, true, true, authorities); 
     this.setId(id); 
    } 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
} 

답변

1

난 당신이 DEBUG 로깅 수준을 설정하고 무슨 일이 일어나고 있는지 확인하기 위해 로그를 검사하는 것이 좋습니다.

+0

죄송합니다. 나는 그것을 잊었다. 로그를 자세히 살펴본 후에 오류가 내 코드라는 것을 알게되었습니다. (logeduser! = null) { return getuserfromdatabase } return logeduser; 그러나 app에 처음 로그인 한 후 logeduser는 null이 아닙니다. – tzim

0

왜이 속성에 마지막 사용자를 유지 하시겠습니까?

public CustomUser logedUser; 

로그인 할 때마다 오버 라이딩 된 것처럼 보입니다. 그리고 Spring Security가 이미 SecurityContextHolder에 저장할 때 세션에 넣는 이유는 무엇입니까?

스티븐은 로그 출력이 필요하다고 말했습니다.