2013-11-26 12 views
4

보안을 위해 Shiro를 사용하는 Apache Wicket 1.5 응용 프로그램과 종속성 주입을 위해 Guice를 사용합니다. 페이지의 대부분은 상태 비 저장이지만 일부 모델 개체 (사용자 데이터, 현재 메뉴 상태 등)는 동일한 세션의 모든 요청에서 일관성이 있어야합니다. 이러한 모든 객체에는 논리 (주로 데이터베이스에 액세스하기 위해 원격 EJB3 인터페이스를 사용하는 간단한 파인더 메소드)와 상태가 있으며 모두가 Serializable을 구현합니다.Guice @SessionScoped 주석으로 인해 Shiro에서 IllegalArgumentException이 발생합니다. HttpSession

가 여기에 아이디어를 전달한다 짧은 발췌입니다 :

@SessionScoped 
public class UsersImpl implements Users, Serializable { 

    private static final long serialVersionUID = 8841809043461673585L; 
    private final Logger log = LoggerFactory.getLogger(UsersImpl.class); 

    @Inject 
    public UserService users; 

    @Inject 
    public RoleService roles; 

    private UserDTO currentUser; 

    public UserVO findUserByUser(UserVO user) { 
     UserDTO userDto = null; 
     try { 
      userDto = users.findUserByUser(user.toUserDTO()); 
     } catch(Exception e) { 
      log.error("Error finding user:"+user.id, e); 
     } 
     return userDto != null ? new UserVO(userDto) : null; 
    } 

(...) 

} 

내가 개발 단위 @Singleton (편의상)를 사용하여 클래스를 테스트하고, 모든 것이 잘이 방식으로 작동을하지만이 같은 잦은 오류를 얻을, 지금은 생산을위한 @SessionScoped로 전환 한 것을 : 분명히

Guice provision errors: 
1) Error in custom provider, org.apache.shiro.session.InvalidSessionException: 
    java.lang.IllegalArgumentException: 
    HttpSession based implementations of the Shiro Session interface requires attribute keys to be String objects. The HttpSession class does not support anything other than String keys. 

는, Guice는 세션에서 개체를 저장하는 일부 사용자 지정 키 개체를 사용하는 것, 그리고 시로의 HttpSession이 구현은 처리 할 수 ​​없습니다. 이상하게도 충분하지만이 예외는 모든 @SessionScoped 클래스에서 발생하지는 않지만 둘 이상의 클래스에서는 발생합니다.

Guice가 문자열을 사용하여 키스를 사용하도록하는 방법, HttpSession을 더 호환 가능하게 만드는 다른 방법 등 - 나는 할 수있는 아이디어를 찾기 위해 미친 듯이 웹을 검색해 왔습니다. 도움이되는 정보를 찾는 것처럼 보입니다. 또한 오류 메시지에 대한 검색 결과를 보면 전 지구상에서이 문제가있는 유일한 사람인 것처럼 보입니다 ...

이 방법을 사용할 방법이 있습니까? 아니면 여기서 뭔가 잘못하고있는 걸까요?

+0

'시로 '를 어떻게 초기화합니까? 'ShiroModule'을 설치 한가요? –

+0

'ShiroAopModule'과'ShiroWebModule'을 확장하고'shiro.ini'에 넣을 모든 것을 가지고있는 커스텀 패키지를 설치했습니다. 그것은 또한'SessionScoped.class'를'ShiroSessionScope'에 바인드합니다. 'UsersImpl'을위한 별도의 모듈은 없습니다 -'User' 인터페이스는'@ ImplementedBy'로 주석됩니다. – weltraumpirat

+0

'@ SessionScoped' 대신'@ Singleton'을 사용하면 전체 설정이 잘 작동합니다 : 모든 주사가 ​​작동하고 전체 응용 프로그램이 오류없이 실행됩니다. 단 한 명의 사용자로만 제한됩니다. – weltraumpirat

답변

1

음,

당신 오류가 선행 검사에서입니다 ...이 질문에 대답하기 어렵다,하지만 난 당신에게 몇 가지 옵션을 제공하려고 ... 그래서, 오른쪽도 시작하지 않은 응용 프로그램을 것 같은데요? 그럼 당신은 매우 가능성이 높습니다 생산 단계를 사용하거나 열심히 어떤 바인딩이 만들어지고 해당 객체가 Session 범위의 다른 것을 참조하는 것이 문제입니다. 그래서, 지금 당신은이 예에서와 같이 공급자 주입 모든 SessionScope 직접 분사을 변경해야합니다 :

당신이 왜 그렇게

@Inject 
public Provider<UserService> userProvider; //and call userProvider.get() when you will need it? 

@Inject 
public UserService users; 

을 변경할 수 있을까요? 당신이 어떤 런타임 예외에 끝낼 수 있었다 범위를 혼합하는 경우

  1. SessionScoped 객체에만 너무 GuiceFilter.doFilter() whitin 접근 있습니다. 특히 StageProduction으로 변경하거나 일부 싱글 톤을 열심히로드하도록 설정하십시오. 자세한 내용은 here을 참조하십시오. SubjectShiroFilter.doFilter()check my post 내부에 결합되어있을 수 Scopes

  2. 문제를 혼합 때 Providers을 사용하는 것이 좋습니다. 그런 다음 외부에 있다면 GuiceFilter은 그 당시에는 Subject이 될 수 없습니다. 다시 Providers을 사용해보세요.

희망이 조금 있습니다.

+0

감사합니다. 제공자를 이용하겠습니다. 페이지를 호출 할 때 예외가 발생하지만 문제없이 응용 프로그램이 시작됩니다. – weltraumpirat

+1

몇 가지 광범위한 시험과 키보드에서 머리를 부딪 히자 전체 문제의 근본 원인을 찾은 것 같습니다. 부실한 종속성으로 인한 것 같습니다 (ehcache 2.7.4를 사용하여 세션을 저장하고 내 모듈 중 하나 인 ehcache-core는 훨씬 오래된 버전이었습니다). 지금 당장은 전체 애플리케이션을 테스트하는 데 너무 지쳤으나, 비 제공자 버전은 종속성을 업데이트 한 이후로 적어도 내가 본 것에 대해서는 잘 작동하는 것처럼 보인다. 도움을 주셔서 감사합니다. 내일 확실한 답변을 드리겠습니다. – weltraumpirat

+0

모든 종속성을 최신 버전으로 업데이트 했으므로 원래의 오류는 실제로 사라졌습니다. 그러나 제공자에 관한 귀하의 조언은 a) 올바른 방향으로 나아갈 수 있도록 도와 주었고 b) 내가 고심하고있는 또 다른 문제를 부수적으로 수정했습니다. 그러므로 질문을 정확히 풀지는 못했지만 대답을 받아 들일 것입니다. 도움을 주셔서 다시 한 번 감사드립니다. – weltraumpirat