Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法转换为org.springframework.security.core.userdetails.User_Java_Spring_Spring Mvc_Spring Security - Fatal编程技术网

Java 无法转换为org.springframework.security.core.userdetails.User

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

我正在尝试向使用Spring Security的应用程序添加自定义的
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)

因为据我所知,Spring
User
类从来都不是真正需要的您只是导入了错误的
用户
类。


正确的解决方案是从
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)

因为据我所知,Spring
User
类从来都不是真正需要的您只是导入了错误的
用户
类。


正确的解决方案是从
CustomUserDetailsService
顶部的导入语句列表中删除
org.springframework.security.core.userdetails.User
的导入,并添加您自己的语句。

谢谢,但关键是让Spring安全性发挥作用。不仅仅是检索
my.app.model.User
。如果它不能在
appService
的返回中将
my…User
转换为
springframework…User
,那么我如何支持在下一行代码中转换它?在自定义
UserDetailsService
的上下文中,我想知道为什么我不需要
userdetails.User
。您是否有专门使用Spring Security的经验?或者你只是给我一个一般的java答案?我确实有Spring安全性方面的经验,但在这种情况下,这并不是非常必要的。您不需要导入Spring
User
类,因为您从未使用过它。您需要返回一个
UserDetails
实例。谢谢,但关键是要让Spring安全性工作。不仅仅是检索
my.app.model.User
。如果它不能在
appService
的返回中将
my…User
转换为
springframework…User
,那么我如何支持在下一行代码中转换它?在自定义
UserDetailsService
的上下文中,我想知道为什么我不需要
userdetails.User
。您是否有专门使用Spring Security的经验?或者你只是给我一个一般的java答案?我确实有Spring安全性方面的经验,但在这种情况下,这并不是非常必要的。您不需要导入Spring
User
类,因为您从未使用过它。您需要返回一个
UserDetails
实例。