身份验证管理器如何验证凭据?

时间:2015-05-12 09:48:16

标签: spring spring-security

我在我的网络应用程序中使用spring security。

我们这里有身份验证管理器& 身份验证提供程序我们直接或通过服务提供身份验证用户详细信息。

喜欢:

 <authentication-manager>  
    <authentication-provider user-service-ref="loginService" />  
 </authentication-manager>  

如何在内部执行验证。验证逻辑在哪里?

内部发生了什么?

任何人都可以提出解释。

2 个答案:

答案 0 :(得分:0)

Spring security Javadoc是你的朋友!

AuthenticationManager是一个接口。默认实现为ProviderManager,其中包含AuthenticationProvider列表。按顺序尝试每个AuthenticationProvider,直到可以决定提出的身份验证凭据。

此处,<authentication-provider user-service-ref="loginService" />声明DaoAuthenticationProviderDaoAuthenticationProviderUserDetailsService(此处为loginService)加载用户信息,并将用户名/密码组合与登录时提供的值进行比较。如果一切正常,则会使用从AuthenticationToken检索到的值填充loginService,并将ID传递回AuthenticationManager。如果凭据错误,则会抛出AuthenticationException

答案 1 :(得分:0)

它是这样的:

Security-application-context.xml:

   <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider user-service-ref="LoginServiceImpl">
           <security:password-encoder  ref="encoder"/>
        </security:authentication-provider>
    </security:authentication-manager>

    <beans:bean id="encoder"
                class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
        <beans:constructor-arg name="strength" value="11" />
    </beans:bean>

    <beans:bean id="daoAuthenticationProvider"
                class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
                <beans:property name="userDetailsService" ref="LoginServiceImpl"/>
               <beans:property name="passwordEncoder" ref="encoder"/>
    </beans:bean>

在上面的代码中,您可以看到身份验证管理器指示user-service-ref是LoginServiceImpl并使用BCrypt编码进行11轮加密。然后它使用LoginServiceImpl查找类,如下所述:

@Transactional
@Service("userDetailsService")
public class LoginServiceImpl implements UserDetailsService{

    @Autowired private PersonDAO personDAO;
    @Autowired private Assembler assembler;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException,DataAccessException {
        Person person = personDAO.findPersonByUsername(username.toLowerCase());
            if(person == null) { throw new UsernameNotFoundException("Wrong username or password");}
        return assembler.buildUserFromUserEntity(person);
    }

    public LoginServiceImpl() {
    }
}

如您所见,它通过在数据库中搜索用户来调用数据库方法。如果找到了,那么基于UserDetails类构建一个新人,如下所示,我在汇编程序中进行构建:

@Service("assembler")
public class Assembler {
    @Transactional(readOnly = true)
    User buildUserFromUserEntity(Person userEntity){
        String username = userEntity.getUsername().toLowerCase();
        String password = userEntity.getPassword();

        boolean enabled = userEntity.isEnabled();
        boolean accountNonExpired = userEntity.isAccountNonExpired();
        boolean credentialsNonExpired = userEntity.isCredentialsNonExpired();
        boolean accountNonLocked = userEntity.isAccountNonLocked();

        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

        return new User(username,password,enabled,accountNonExpired,credentialsNonExpired,accountNonLocked,authorities);
        }
}

这些其他人指出帐户是否未过期,未锁定以及其他详细信息。我希望你按照这个程序。