WebアプリケーションにSpringSecurityを含めようとしています。このために、私は次のような独自のUserDetailsService実装を作成しました。
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];
}
...
}
なんでこんな感じなのかしら。明らかに、私は春がどのように機能するかについてあまり理解していないので、誰かが光を当てることができれば素晴らしいでしょう。