2012-02-10 10 views
0

私はどのユーザーがWebサイトでオンラインになっているのか知る必要があります。そのため、Spring Security(org.springframework.security.core.session.SessionRegistryImpl)が提供するセッションレジストリを使用しています。ここに私の春のセキュリティ設定は次のとおりです。org.hibernate.LazyInitializationExceptionは、Spring SecurityとSession Registryを使用しています。

<beans:beans xmlns="http://www.springframework.org/schema/security" 
      xmlns:beans="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 
    <beans:bean id="authenticationManager" class="my.package.security.AuthenticationManager" /> 

    <http disable-url-rewriting="true" authentication-manager-ref="authenticationManager"> 
     <intercept-url pattern="/login*" access="ROLE_ANONYMOUS" /> 
     <intercept-url pattern="/*" access="ROLE_USER" /> 
     <form-login login-processing-url="/authorize" login-page="/login" authentication-failure-url="/login-failed" /> 
     <logout logout-url="/logout" logout-success-url="/login" /> 
     <session-management session-authentication-strategy-ref="sas" invalid-session-url="/invalid-session" /> 
    </http> 

    <beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/> 

    <beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy"> 
     <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" /> 
     <beans:property name="maximumSessions" value="1" /> 
    </beans:bean> 
</beans:beans> 

あなたが見ることができるように、私はカスタム認証マネージャ(my.package.security.AuthenticationManager)使用しています。このため

public class AuthenticationManager implements org.springframework.security.authentication.AuthenticationManager 
{ 
    @Autowired 
    UserJpaDao userDao; 

    public Authentication authenticate(Authentication authentication) throws AuthenticationException 
    { 
     User loggedInUser = null; 
     Collection<? extends GrantedAuthority> grantedAuthorities = null; 

     ... 

     loggedInUser = loggedInUser = userDao.findByAlias(authentication.getName()); 
     if(loggedInUser != null) 
     { 
      // Check password etc. 
      grantedAuthorities = loggedInUser.getAuthorities(); 
     } 
     else 
     { 
      throw new BadCredentialsException("Unknown username"); 
     } 

     return new UsernamePasswordAuthenticationToken(loggedInUser, authentication.getCredentials(), grantedAuthorities); 
    } 
} 

を、sessionRegistry.getAllPrincipals()意志UserList<Object> "キャスト可能"のリストをList<User>に返す)。私はそれが私が必要とするものなので、これを手に入れたいと思います。

今、問題はUserが自分のクラスであり、ManyToManyとOneToManyの関係が含まれているということです。このため、sessionRegistry.getAllPrincipals()を呼び出すとorg.hibernate.LazyInitializationExceptionになります。私は、このメソッドがTransaction内で呼び出されないために起こると思いますが、どうすればこの例外が発生するのを防ぐことができますか?

ありがとうございます。

答えて

1

ユーザオブジェクトではなくユーザIDを保存してください。

+0

@Ralphさん、ありがとうございました。これは私が考えたことです。しかし、それは私の方法でより便利ですよね?それ以外の場合は、オンラインユーザーリストを取得する必要があるたびにデータベースを照会する必要があります。私のやり方でそれをすることの不利な点は何ですか? – satoshi

+0

@satoshi:自分のやり方でそれをするのはどういう不利な点がありますか? LazyInitializationException - オブジェクトを現在の休止状態のセッションにマージする必要があります。 dbからロードしない場合は、並行変更や他の多くの問題について考える必要があります。 – Ralph

+0

@satoshi:正直言って、問題を処理する方法の1つは、それらを避けることです。私の答えはそれ以上のものではありません。それは問題を解決することはできませんが、その問題に対処する必要がない解決策かもしれません。 – Ralph

関連する問題