Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
org.hibernate.LazyInitializationException使用Spring安全性和会话注册表_Spring_Spring Security - Fatal编程技术网

org.hibernate.LazyInitializationException使用Spring安全性和会话注册表

org.hibernate.LazyInitializationException使用Spring安全性和会话注册表,spring,spring-security,Spring,Spring Security,我需要知道哪些用户在网站上在线,因此我正在使用Spring Security提供的会话注册表(org.springframework.Security.core.session.SessionRegistryImpl)。以下是我的Spring安全配置: <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework

我需要知道哪些用户在网站上在线,因此我正在使用Spring Security提供的会话注册表(
org.springframework.Security.core.session.SessionRegistryImpl
)。以下是我的Spring安全配置:

<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):

公共类AuthenticationManager实现org.springframework.security.authentication.AuthenticationManager
{
@自动连线
UserJpaDao userDao;
公共身份验证(身份验证)引发AuthenticationException
{
用户loggedInUser=null;

收集你不应该存储用户对象,而应该存储用户id。

谢谢你的回答,@Ralph。这是我考虑过的。但我的方式更方便,对吗?否则每次需要获取在线用户列表时,我总是要查询数据库。以我的方式这样做有什么缺点?@satoshi:disad是什么vantage用我的方式做吗?一个懒散的初始化异常——你无论如何都需要将对象合并到你当前的hibernate会话中。如果你不从db加载它们,你将需要考虑并发修改和许多其他问题。@satoshi:老实说,处理问题的一种方法就是避免它们——我的答案是没有更多.这不会解决问题,但也许不必解决这个问题是一个解决办法。
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);
    }
}