我有一个带有 spring security 的 Spring 应用程序,一切都很好。当我尝试在注册时登录用户时,我无法让它工作......
我进行了很多搜索,发现我的主体是我的 UserDetails 对象,因此我需要一个通过 MyUserDetailsService 中的用户名返回它的方法:
public class MyUserDetailsService implements UserDetailsService {
private UserService userService;
@Autowired(required=true)
@Qualifier(value="userService")
public void setUserService(UserService us){
this.userService = us;
}
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
// Programmatic transaction management
/*
return transactionTemplate.execute(new TransactionCallback<UserDetails>() {
public UserDetails doInTransaction(TransactionStatus status) {
com.mkyong.users.model.User user = userDao.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());
return buildUserForAuthentication(user, authorities);
}
});*/
Users user = userService.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRoleses());
return buildUserForAuthentication(user, authorities);
}
// Converts com.mkyong.users.model.User user to
// org.springframework.security.core.userdetails.User
private User buildUserForAuthentication(Users user, List<GrantedAuthority> authorities) {
return new User(user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true, authorities);
}
private List<GrantedAuthority> buildUserAuthority(Set<UserRoles> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRoles userRole : userRoles) {
System.out.println("----------------------->"+userRole+"<---------------------------------------");
setAuths.add(new SimpleGrantedAuthority(userRole.getRoles().getRole() ));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
在我的 Controller 上注册后,我尝试通过执行以下操作来登录用户:
MyUserDetailsService myuds = new MyUserDetailsService();
UserDetails ud = myuds.loadUserByUsername(user.getUsername());
// Authentication authentication = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(),
// AuthorityUtils.createAuthorityList("ROLE_CONCORRENTE"));
// SecurityContextHolder.getContext().setAuthentication(authentication);
Authentication authentication = new UsernamePasswordAuthenticationToken(ud, null);
SecurityContextHolder.getContext().setAuthentication(authentication);
我什至自动连接了 beans:
private MyUserDetailsService myUserDetailsService;
@Autowired(required=true)
@Qualifier(value="myUserDetailsService")
public void setMyUserDetailsService(MyUserDetailsService userdetailsservice){
this.myUserDetailsService = userdetailsservice;
}
我的 bean :
<bean id="myUserDetailsService" class="com.setelog.spring.service.MyUserDetailsService" >
<property name="userService" ref="userService" />
</bean>
最佳答案
这个案例可能存在很多问题 1)你是否定义了spring将在其中搜索bean的包 2)您是否将此类定义为服务(例如通过使用@service注释) 3)你有提供它的实现吗?
关于java - Spring MVC 以编程方式登录 : No qualifying bean of type MyUserDetailsService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31322687/