2014-02-23 2 views
3

Apache Shiro를 시작합니다. 나는 간단한 예제로 시작했고 내가가는대로 복잡성을 구축 해왔다.Apache Shiro : 사용자 이름/비밀번호로 인증하지만 사용자 ID를 기본 비밀번호로 저장

현재 JSF로 로그인 양식에서 이메일 주소와 비밀번호를 수집하고 UsernamePasswordToken을 사용하여 Shiro 사용자를 인증합니다. 사용자에 대한 추가 정보를 얻으려면, 같은 자신의 이름으로 나는에서 사용자를 찾고 있어요

jdbcRealm.authenticationQuery = SELECT password FROM user WHERE email = ? 

UsernamePasswordToken token = new UsernamePasswordToken(email, password); 
SecurityUtils.getSubject().login(token); 

간단한 쿼리 상자 JDBC 영역의 밖으로의 지원을받습니다 교장에 의한 데이터베이스 - 이메일 주소입니다.

currentUser = userDAO.findByEmail((String) SecurityUtils.getSubject().getPrincipal()); 

이 방법은 정상적으로 작동하지만 사용자가 이메일 주소를 변경할 수 있으므로 조회가 중단됩니다. 내 목표는 전자 메일 주소가 아니라 주체로 고유 한 사용자 ID를 저장하는 것입니다. 절대 변경할 수 없기 때문입니다. 이 일을 어떻게 성취 할 수 있습니까?

답변

1

간단한 접근으로이 문제를 해결했습니다. 인증 토큰을 만들기 전에 전자 메일 주소에서 사용자 ID로 변환하고 사용자 ID를 토큰의 주체로 사용하십시오.

try{ 
    // Lookup the user by email 
    User user = userDAO.findByEmail(email); 

    // If no match we can't authenticate 
    if(user == null){ 
     throw new AuthenticationException(); 
    } 

    // Else, build a token with the user id and password 
    UsernamePasswordToken token = new UsernamePasswordToken(user.getUserId().toString(), password); 

    // Attempt to login 
    SecurityUtils.getSubject().login(token); 

}catch(AuthenticationException ex){ 
    return false; 
} 

내 UserDAO 빈은 javax.persistence.NoResultException을 처리하고 null을 반환하도록 구성됩니다. 내 shiro.ini 파일에서

는 내가 지금에 의해 찾고 있어요 사용자에 대한 세부 정보를 조회하기 위해, 마지막으로

jdbcRealm.authenticationQuery = SELECT password FROM user WHERE user_id = CAST(? AS UNSIGNED) 

(내가 MySQL을 사용하고있어주의) 다음에 jdbcRealm.authenticationQuery을 변경 한 사용자 ID는 이제 주체입니다.

currentUser = userDAO.findByUserId(Integer.parseInt((String) SecurityUtils.getSubject().getPrincipal()));