Spring安全性:自动化的userDetailsS​​ervice

时间:2012-08-07 10:57:36

标签: spring spring-mvc spring-security

我尝试基于Spring安全性实现自定义授权。 这是config.xml:

<global-method-security pre-post-annotations="enabled" />
    <http use-expressions="true">
        <form-login login-page="/wellcome/" login-processing-url="/login" default-target-url="/" 
            username-parameter="email" password-parameter="password" />
        <remember-me key="skyhandling" token-validity-seconds="-1" />
        <logout invalidate-session="true" logout-success-url="/" logout-url="/logout"/>
        <intercept-url pattern="/administration/**" access="authenticated"/>
        <intercept-url pattern="/wellcome/" access="permitAll"/>
        <intercept-url pattern="/login" access="permitAll"/>
        <intercept-url pattern="/css/**" access="permitAll"/>
        <intercept-url pattern="/images/**" access="permitAll"/>
        <intercept-url pattern="/javascript/**" access="permitAll"/>
    </http>
    <beans:bean id="authenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDetailsService"/>
    </beans:bean>
    <beans:bean id="authenticationManager"
        class="org.springframework.security.authentication.ProviderManager">
        <beans:property name="providers">
            <beans:list>
                <beans:ref local="authenticationProvider" />
            </beans:list>
        </beans:property>
    </beans:bean>
    <beans:bean class="com.test.service.UserDetailsExtendedService" id="userDetailsService" />
    <beans:bean class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" 
        id="passwordEncoder" />
    <authentication-manager>
        <authentication-provider user-service-ref="userDetailsService">
            <password-encoder ref="passwordEncoder" />
        </authentication-provider>
    </authentication-manager>

用户详细信息服务:

@Service("userDetailsService")
@SuppressWarnings("deprecation")
public class UserDetailsExtendedService implements UserDetailsService {
    @Autowired
    private UsersDAO dao;

    /**
     * 
     * @param user
     * @return
     */
    private User prepare(com.test.User user) {
        boolean enabled = user.getState().equals(UserState.Active);

        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        for (UserRole r: user.getRoles()) {
          authorities.add(new GrantedAuthorityImpl(r.getName()));
        }

        return new UserDetailsExtended(user.getEmail(), user.getPassword(), user.getNickname(), enabled,
            enabled, enabled, enabled, authorities);
    }

    /**
     * 
     * @param email
     * @return
     */
    @Transactional(readOnly = true)
    public User loadUserByUsername(final String email) 
            throws UsernameNotFoundException, DataAccessException {
        com.test.User user = dao.getByEmail(email);
        if (user == null)
            throw new UsernameNotFoundException(email);

        return prepare(user);
    }
}

一切正常。但是当我添加

@Autowired 
private UserDetailsExtendedService useDetailsService;

进入Controller类,应用程序开始失败:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.test.service.UserDetailsExtendedService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我错过了什么?谢谢

UPD#1:

 <context:annotation-config />
    <context:component-scan base-package="com.test.service" />
    <bean id="usersDao" class="com.test.dao.UsersDAO" />
    <bean id="eventsLogDao" class="com.test.dao.EventsLogDAO" />
    <bean id="employeesDao" class="com.test.dao.EmployeesDAO" />
    <bean id="dictionariesDao" class="com.test.dao.DictionariesDAO" />

2 个答案:

答案 0 :(得分:0)

在您的配置中,您有一个com.ejl.skyhandling.service.UserDetailsExtendedService但是 在你的bean中,你试图访问com.test.service.UserDetailsExtendedService,这显然是另一种类型。

请检查您的进口。

答案 1 :(得分:0)

由于您使用值“userDetailsS​​ervice”验证@Service,请确保@Autowired是

@Autowired
private UserDetailsExtendedService userDetailsService;

您目前在变量名称中缺少r - &gt; useDetailsS​​ervice