Java 无法转换为org.springframework.security.core.userdetails.User
我正在尝试向使用Spring Security的应用程序添加自定义的Java 无法转换为org.springframework.security.core.userdetails.User,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我正在尝试向使用Spring Security的应用程序添加自定义的UserDetailsService。但是CustomUserDetailsService.java中的以下代码行: User user = this.appService.findUserByUsernameAndPin(username, pin); package my.app.service; import java.util.ArrayList; import java.util.Collection; impor
UserDetailsService
。但是CustomUserDetailsService.java
中的以下代码行:
User user = this.appService.findUserByUsernameAndPin(username, pin);
package my.app.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
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;
import my.app.model.Role;
@Service
@Transactional(readOnly=true)
public class CustomUserDetailsService implements UserDetailsService {
private final AppService appService;
@Autowired
public CustomUserDetailsService(AppService appService) {this.appService = appService;}
@Override
public UserDetails loadUserByUsername(String input) throws UsernameNotFoundException, DataAccessException{
String[] split = input.split(":");
if(split.length < 2)
{
System.out.println("User did not enter both username and pin code.");
throw new UsernameNotFoundException("Must specify both username and pin code.");
}
String username = split[0];
String pin = split[1];
System.out.println("Username = " + username);
System.out.println("Corporate domain = " + pin);
//THE NEXT LINE NEEEDS TO BE FIXED. BUT HOW?
User user = this.appService.findUserByUsernameAndPin(username, pin);
if(user == null){
System.out.println("User could not be found, must be an invalid username/pin combo.");
throw new UsernameNotFoundException("Invalid username or pin");
}
System.out.println("Returning user: " + user);
return user;
}
public Collection<GrantedAuthority> getAuthorities(Set<Role> roles) {
List<GrantedAuthority> authList = getGrantedAuthorities(getRolesAsList(roles));
return authList;
}
public List<String> getRolesAsList(Set<Role> roles) {
List <String> rolesAsList = new ArrayList<String>();
for(Role role : roles){
rolesAsList.add(role.getRole());
}
return rolesAsList;
}
public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) {
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (String role : roles) {
authorities.add(new SimpleGrantedAuthority(role));
}
return authorities;
}
}
正在eclipse中引发以下编译错误:
Type Mismatch Error: cannot convert from my.app.model.User to org.springframework.security.core.userdetails.User
那么,如何解决此错误,使自定义的UserDetailsService
能够正常工作呢?这里是CustomUserDetailsService.java
:
User user = this.appService.findUserByUsernameAndPin(username, pin);
package my.app.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
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;
import my.app.model.Role;
@Service
@Transactional(readOnly=true)
public class CustomUserDetailsService implements UserDetailsService {
private final AppService appService;
@Autowired
public CustomUserDetailsService(AppService appService) {this.appService = appService;}
@Override
public UserDetails loadUserByUsername(String input) throws UsernameNotFoundException, DataAccessException{
String[] split = input.split(":");
if(split.length < 2)
{
System.out.println("User did not enter both username and pin code.");
throw new UsernameNotFoundException("Must specify both username and pin code.");
}
String username = split[0];
String pin = split[1];
System.out.println("Username = " + username);
System.out.println("Corporate domain = " + pin);
//THE NEXT LINE NEEEDS TO BE FIXED. BUT HOW?
User user = this.appService.findUserByUsernameAndPin(username, pin);
if(user == null){
System.out.println("User could not be found, must be an invalid username/pin combo.");
throw new UsernameNotFoundException("Invalid username or pin");
}
System.out.println("Returning user: " + user);
return user;
}
public Collection<GrantedAuthority> getAuthorities(Set<Role> roles) {
List<GrantedAuthority> authList = getGrantedAuthorities(getRolesAsList(roles));
return authList;
}
public List<String> getRolesAsList(Set<Role> roles) {
List <String> rolesAsList = new ArrayList<String>();
for(Role role : roles){
rolesAsList.add(role.getRole());
}
return rolesAsList;
}
public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) {
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (String role : roles) {
authorities.add(new SimpleGrantedAuthority(role));
}
return authorities;
}
}
AppService.java
是:
package my.app.service;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface AppService {
public User getUser(String logn) throws DataAccessException;
public User findUserByLogin(String ls) throws DataAccessException;
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import my.app.model.User;
import my.app.repository.UserRepository;
@Service
public class AppServiceImpl implements AppService {
private UserRepository userRepository;
@Autowired
public AppServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public User getUser(String logn) throws DataAccessException {
System.out.println("]]]]]]]]] getting user [[[[[[[[");
return userRepository.getUser(logn);
}
@Override
@Transactional(readOnly = true)
public User findUserByLogin(String uid) throws DataAccessException {
return userRepository.findUserByLogin(uid);
}
@Override
@Transactional(readOnly = true)
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException{
return userRepository.findUserByUsernameAndPin(username, pin);
}
}
package my.app.repository;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface UserRepository {
User getUser(String logn) throws DataAccessException;
User findUserByLogin(String pid) throws DataAccessException;
User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.repository.jpa;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import my.app.model.User;
import my.app.repository.UserRepository;
@Repository
public class JpaUserRepositoryImpl implements UserRepository {
@PersistenceContext
private EntityManager em;
@Override
public User getUser(String logn) {
Query query = this.em.createQuery("SELECT user FROM User user WHERE user.login =:logn");
query.setParameter("logn", logn);
User theuser = (User) query.getSingleResult();
return theuser;
}
@SuppressWarnings("unchecked")
public User findUserByLogin(String name) {
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name");
query.setParameter("name", name + "%");
return (User) query.getSingleResult();
}
@SuppressWarnings("unchecked")
public User findUserByUsernameAndPin(String username, String pin){
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name AND user.pin =:pn");
query.setParameter("name", username);
query.setParameter("pn", pin);
return (User) query.getSingleResult();
}
}
AppServiceImpl.java
是:
package my.app.service;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface AppService {
public User getUser(String logn) throws DataAccessException;
public User findUserByLogin(String ls) throws DataAccessException;
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import my.app.model.User;
import my.app.repository.UserRepository;
@Service
public class AppServiceImpl implements AppService {
private UserRepository userRepository;
@Autowired
public AppServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public User getUser(String logn) throws DataAccessException {
System.out.println("]]]]]]]]] getting user [[[[[[[[");
return userRepository.getUser(logn);
}
@Override
@Transactional(readOnly = true)
public User findUserByLogin(String uid) throws DataAccessException {
return userRepository.findUserByLogin(uid);
}
@Override
@Transactional(readOnly = true)
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException{
return userRepository.findUserByUsernameAndPin(username, pin);
}
}
package my.app.repository;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface UserRepository {
User getUser(String logn) throws DataAccessException;
User findUserByLogin(String pid) throws DataAccessException;
User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.repository.jpa;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import my.app.model.User;
import my.app.repository.UserRepository;
@Repository
public class JpaUserRepositoryImpl implements UserRepository {
@PersistenceContext
private EntityManager em;
@Override
public User getUser(String logn) {
Query query = this.em.createQuery("SELECT user FROM User user WHERE user.login =:logn");
query.setParameter("logn", logn);
User theuser = (User) query.getSingleResult();
return theuser;
}
@SuppressWarnings("unchecked")
public User findUserByLogin(String name) {
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name");
query.setParameter("name", name + "%");
return (User) query.getSingleResult();
}
@SuppressWarnings("unchecked")
public User findUserByUsernameAndPin(String username, String pin){
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name AND user.pin =:pn");
query.setParameter("name", username);
query.setParameter("pn", pin);
return (User) query.getSingleResult();
}
}
UserRepository.java
是:
package my.app.service;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface AppService {
public User getUser(String logn) throws DataAccessException;
public User findUserByLogin(String ls) throws DataAccessException;
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import my.app.model.User;
import my.app.repository.UserRepository;
@Service
public class AppServiceImpl implements AppService {
private UserRepository userRepository;
@Autowired
public AppServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public User getUser(String logn) throws DataAccessException {
System.out.println("]]]]]]]]] getting user [[[[[[[[");
return userRepository.getUser(logn);
}
@Override
@Transactional(readOnly = true)
public User findUserByLogin(String uid) throws DataAccessException {
return userRepository.findUserByLogin(uid);
}
@Override
@Transactional(readOnly = true)
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException{
return userRepository.findUserByUsernameAndPin(username, pin);
}
}
package my.app.repository;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface UserRepository {
User getUser(String logn) throws DataAccessException;
User findUserByLogin(String pid) throws DataAccessException;
User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.repository.jpa;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import my.app.model.User;
import my.app.repository.UserRepository;
@Repository
public class JpaUserRepositoryImpl implements UserRepository {
@PersistenceContext
private EntityManager em;
@Override
public User getUser(String logn) {
Query query = this.em.createQuery("SELECT user FROM User user WHERE user.login =:logn");
query.setParameter("logn", logn);
User theuser = (User) query.getSingleResult();
return theuser;
}
@SuppressWarnings("unchecked")
public User findUserByLogin(String name) {
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name");
query.setParameter("name", name + "%");
return (User) query.getSingleResult();
}
@SuppressWarnings("unchecked")
public User findUserByUsernameAndPin(String username, String pin){
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name AND user.pin =:pn");
query.setParameter("name", username);
query.setParameter("pn", pin);
return (User) query.getSingleResult();
}
}
JpaUserRepositoryImpl.java
是:
package my.app.service;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface AppService {
public User getUser(String logn) throws DataAccessException;
public User findUserByLogin(String ls) throws DataAccessException;
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import my.app.model.User;
import my.app.repository.UserRepository;
@Service
public class AppServiceImpl implements AppService {
private UserRepository userRepository;
@Autowired
public AppServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public User getUser(String logn) throws DataAccessException {
System.out.println("]]]]]]]]] getting user [[[[[[[[");
return userRepository.getUser(logn);
}
@Override
@Transactional(readOnly = true)
public User findUserByLogin(String uid) throws DataAccessException {
return userRepository.findUserByLogin(uid);
}
@Override
@Transactional(readOnly = true)
public User findUserByUsernameAndPin(String username, String pin) throws DataAccessException{
return userRepository.findUserByUsernameAndPin(username, pin);
}
}
package my.app.repository;
import org.springframework.dao.DataAccessException;
import my.app.model.User;
public interface UserRepository {
User getUser(String logn) throws DataAccessException;
User findUserByLogin(String pid) throws DataAccessException;
User findUserByUsernameAndPin(String username, String pin) throws DataAccessException;
}
package my.app.repository.jpa;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import my.app.model.User;
import my.app.repository.UserRepository;
@Repository
public class JpaUserRepositoryImpl implements UserRepository {
@PersistenceContext
private EntityManager em;
@Override
public User getUser(String logn) {
Query query = this.em.createQuery("SELECT user FROM User user WHERE user.login =:logn");
query.setParameter("logn", logn);
User theuser = (User) query.getSingleResult();
return theuser;
}
@SuppressWarnings("unchecked")
public User findUserByLogin(String name) {
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name");
query.setParameter("name", name + "%");
return (User) query.getSingleResult();
}
@SuppressWarnings("unchecked")
public User findUserByUsernameAndPin(String username, String pin){
Query query = this.em.createQuery("SELECT DISTINCT user FROM User user WHERE user.login =:name AND user.pin =:pn");
query.setParameter("name", username);
query.setParameter("pn", pin);
return (User) query.getSingleResult();
}
}
您在
my.app.model.User
和org.springframework.security.core.userdetails.User
之间存在类名冲突
这是好的,你只需要明确说明你在特定时间处理的是哪一个。您的AppService
类返回my.app.model.User
,但您的customuserdetails服务
实际导入了org.springframework.security.core.userdetails.User
你有两个选择。错误的做法是:
my.app.model.User User=this.appService.findUserByUsernameAndPin(用户名,pin)代码>
因为据我所知,SpringUser
类从来都不是真正需要的您只是导入了错误的用户
类。
正确的解决方案是从CustomUserDetailsService
顶部的导入语句列表中删除导入org.springframework.security.core.userdetails.User
,您在my.app.model.User
和org.springframework.security.core.userdetails.User
之间存在类名冲突
这是好的,你只需要明确说明你在特定时间处理的是哪一个。您的AppService
类返回my.app.model.User
,但您的customuserdetails服务
实际导入了org.springframework.security.core.userdetails.User
你有两个选择。错误的做法是:
my.app.model.User User=this.appService.findUserByUsernameAndPin(用户名,pin)代码>
因为据我所知,SpringUser
类从来都不是真正需要的您只是导入了错误的用户
类。
正确的解决方案是从CustomUserDetailsService
顶部的导入语句列表中删除org.springframework.security.core.userdetails.User
的导入,并添加您自己的语句。谢谢,但关键是让Spring安全性发挥作用。不仅仅是检索my.app.model.User
。如果它不能在appService
的返回中将my…User
转换为springframework…User
,那么我如何支持在下一行代码中转换它?在自定义UserDetailsService
的上下文中,我想知道为什么我不需要userdetails.User
。您是否有专门使用Spring Security的经验?或者你只是给我一个一般的java答案?我确实有Spring安全性方面的经验,但在这种情况下,这并不是非常必要的。您不需要导入SpringUser
类,因为您从未使用过它。您需要返回一个UserDetails
实例。谢谢,但关键是要让Spring安全性工作。不仅仅是检索my.app.model.User
。如果它不能在appService
的返回中将my…User
转换为springframework…User
,那么我如何支持在下一行代码中转换它?在自定义UserDetailsService
的上下文中,我想知道为什么我不需要userdetails.User
。您是否有专门使用Spring Security的经验?或者你只是给我一个一般的java答案?我确实有Spring安全性方面的经验,但在这种情况下,这并不是非常必要的。您不需要导入SpringUser
类,因为您从未使用过它。您需要返回一个UserDetails
实例。