我在我的网络应用程序中使用spring security。
我们这里有身份验证管理器& 身份验证提供程序我们直接或通过服务提供身份验证用户详细信息。
喜欢:
<authentication-manager>
<authentication-provider user-service-ref="loginService" />
</authentication-manager>
如何在内部执行验证。验证逻辑在哪里?
内部发生了什么?
任何人都可以提出解释。
答案 0 :(得分:0)
Spring security Javadoc是你的朋友!
AuthenticationManager是一个接口。默认实现为ProviderManager
,其中包含AuthenticationProvider
列表。按顺序尝试每个AuthenticationProvider
,直到可以决定提出的身份验证凭据。
此处,<authentication-provider user-service-ref="loginService" />
声明DaoAuthenticationProvider
。 DaoAuthenticationProvider
从UserDetailsService
(此处为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);
}
}
这些其他人指出帐户是否未过期,未锁定以及其他详细信息。我希望你按照这个程序。