0

WebアプリケーションにSpringSecurityを含めようとしています。このために、私は次のような独自のUserDetailsS​​ervice実装を作成しました。

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("userRepositoryImpl")
public class UserRepositoryImpl implements UserDetailsService {

        @PersistenceContext
        private EntityManager entityManager;

        @Override
        @Transactional(readOnly = true)
        public User loadUserByUsername(String username)
                        throws UsernameNotFoundException {
                User user = entityManager.find(User.class, username);
                if (user == null)
                        throw new UsernameNotFoundException("Username not found: "
                                        + username);
                return user;
        }

}

私の問題は、entityManagerがloadUserByUserNameメソッドを呼び出すときに常にnullになることです。私はいくつかの同様の答えでここで提案されたいくつかのことを試みましたが、何も役に立ちませんでした。

これは私の現在のsecurity-app-context.xmlです:

<http use-expressions="true" auto-config="true">
    <intercept-url pattern="/task/" access="permitAll" />
    <intercept-url pattern="/task/**" access="isAuthenticated()" />

    <!-- <intercept-url pattern="/**" access="denyAll" /> -->
    <form-login />
</http>

<beans:bean id="userRepositoryImpl" class="de.sveri.jeiwomisa.model.UserRepositoryImpl" autowire="byType">
</beans:bean>        
<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder">
</beans:bean>
<authentication-manager>
    <authentication-provider user-service-ref="userRepositoryImpl">
        <password-encoder ref="passwordEncoder" />
    </authentication-provider>
</authentication-manager>

そこに何が間違っているかもしれないという考えはありますか?

よろしく、スヴェン

編集:もう少し試してみると、ログインプロセス中に汎用DaoImplでentityManagerを使用できないことがわかりました。 しかし、私は別のプロセスでデータを送受信するためにそれを使用することができます。これはダオです:

@Transactional
public abstract class DaoImpl<T> implements Dao<T> {

    private Class<T> type;

    @PersistenceContext
    protected EntityManager em;

    public DaoImpl() {
            Type t = getClass().getGenericSuperclass();
            ParameterizedType pt = (ParameterizedType) t;
            type = (Class) pt.getActualTypeArguments()[0];
    }
...
}

なんでこんな感じなのかしら。明らかに、私は春がどのように機能するかについてあまり理解していないので、誰かが光を当てることができれば素晴らしいでしょう。

4

1 に答える 1

0

フォーラムの春のチームの素敵な人のおかげで、私はそれを機能させました。security-app-context.xmlが次のようになるように、xml定義を変更してタグを追加する必要がありました。

<b:beans xmlns:b="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.springframework.org/schema/security"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/security     http://www.springframework.org/schema/security/spring-security-3.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:annotation-config/>

....

これはフォーラムエントリへのリンクです:http://forum.springsource.org/showthread.php?128626-EntityManager-null-when-implementing-UserDetailsS​​ervice

于 2012-07-24T07:30:49.793 に答える