- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将自定义UserDetailsService
添加到使用Spring Security的应用程序中。但是 CustomUserDetailsService.java
中的以下代码行:
User user = this.appService.findUserByUsernameAndPin(username, pin);
在 eclipse 中抛出以下编译错误:
Type Mismatch Error: cannot convert from my.app.model.User to org.springframework.security.core.userdetails.User
那么如何解决此错误,使自定义 UserDetailsService
能够正常工作?这是 CustomUserDetailsService.java
:
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;
}
}
my.app.model.User.java
实现 UserDetails
并且是:
package my.app.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
@Entity
@Table(name="users")
public class User implements UserDetails{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Integer id;
@Column(name= "email", unique=true, nullable=false)
private String login;//must be a valid email address
@Column(name = "password")
private String password;
@Column(name = "phone")
private String phone;
@Column(name = "pin")
private String pin;
@Column(name = "sessionid")
private String sessionId;
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name="user_roles",
joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},
inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}
)
private Set<Role> roles;
public Integer getId() {return id;}
public void setId(Integer id) { this.id = id;}
public String getPhone(){return phone;}
public void setPhone(String pn){phone = pn;}
public String getPin(){return pin;}
public void setPin(String pi){pin = pi;}
public String getSessionId(){return sessionId;}
public void setSessionId(String sd){sessionId = sd;}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//roles methods
public void addRole(Role alg) {roles.add(alg);}
public Set<Role> getRoles(){
if(this.roles==null){this.roles = new HashSet<Role>();}
return this.roles;
}
public void setRoles(Set<Role> alg){this.roles = alg;}
public boolean isInRoles(int aid){
ArrayList<Role> mylgs = new ArrayList<Role>();
mylgs.addAll(this.roles);
for(int a=0;a<mylgs.size();a++){if(mylgs.get(a).getId()==aid){return true;}}
return false;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getUsername() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return false;
}
}
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;
}
AppServiceImpl.java
是:
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);
}
}
UserRepository.java
是:
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;
}
JpaUserRepositoryImpl.java
是:
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
,但您的 CustomUserDetailsService
实际上已导入 org.springframework.security.core.userdetails.User
。
你有两个选择。 错误的方法是这样做:
my.app.model.User user = this.appService.findUserByUsernameAndPin(用户名, pin);
因为据我所知,Spring User
类实际上从未被需要。 您只是导入了错误的User
类。
正确的解决方案是从 CustomUserDetailsService
顶部的导入语句列表中删除 org.springframework.security.core.userdetails.User
的导入,并添加您自己的语句。
关于java - 无法转换为 org.springframework.security.core.userdetails.User,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32233139/
我正在尝试获取 session 数据,在 Service-GlobalServiceService 的 GetSessionData() 方法和我的 Component-HeaderComponent
Spring Security 有一个代表经过身份验证的用户的基类(org.springframework.security.core.userdetails.User): Models core u
我在应用程序中添加用户时遇到问题,放上代码。 //This is the SpringSecurityConfig class @Configuration public class SpringSe
我正在从用户创建 X-Auth-Token。但是,当我尝试从生成的 token 中检索用户时,它给了我一个异常 Warning: StandardWrapperValve[com.security
我有一个项目使用 spring boot,spring security 和 oauth2。当我使用 SecurityContextHolder.getContext().getAuthenticat
我已经看到,如果我想在 Spring Security 中激活并发控制,我必须添加: 到applicationContext并且: org.springframewor
我在 spring-boot 应用程序中使用 LDAP 身份验证(基于注释的配置)。我想自定义 UserDetails 对象。默认 UserDetails 实现是 LdapUserDetailsImp
如何通过将ManualUserDetails扩展org.springframework.security.core.userdetails.UserDetails添加到SecurityContextH
我需要保存一些有关用户的附加信息以排除过多的数据库请求。据我了解,我必须: 1)重写UserDetails接口(interface)。在此实现中保存我需要的所有附加信息。 2)重写UserDetail
我需要使用对象列表进行访问控制。获取该列表的查询非常复杂且冗长,因此当用户通过服务器进行身份验证时,我想将其缓存在用户对象中。我决定尝试通过 UserDetailService 和 WebSecuri
Spring Boot 应用程序具有自定义的 UserDetails。当应用程序所做的只是使用 User 类从数据库中验证现有用户时,一切正常。但是,当我尝试进行更改以便人们可以通过应用程序 GUI
我是 Spring Security 的新手。我已经实现了 UserDetails 来创建我自己的用户。我也有我的自定义 userDetailsService。现在一切正常,但我需要在不登录的情况
我正在使用 Grails 1.3.7。我有一个自定义 UserDetails在我的 customUserDetailsService 中创建的对象在认证过程中。我假设这个自定义 UserDetails
我有一个 Spring 项目,我正在将当前的身份验证转换为使用 SAML2。 就身份验证而言,我已经完成了所有工作,但是我很难让 SAML2 扩展将我的自定义 UserDetails 对象插入到 Sp
在我的 Web 应用程序中,我使用 Spring Security 和 UserDetailsService 实现进行身份验证。 现在我需要获取当前 session 的客户端 IP 地址并将其存储
我想向 userdetails 添加其他信息,例如用户的 IP 地址。有什么办法可以做到这一点?我试图创建一个新的 CustomSpringUser 类,但问题是我如何从 Authentication
我尝试使用 OAuth2 保护我的 Spring Boot 应用程序。在某些方面,一切正常。当我尝试从 oauth/token 获取访问 token 时端点第一次尝试我得到 token 没有问题。当我
我原以为我的授权实现已完成,但在尝试检索 UserDetails 对象时,我得到的只是用户名。 我正在使用具有以下细节的 oauth。 配置 AuthenticationManager: @Overr
我在我的网络项目中使用 SpringSecurity。我有保存在数据库中的实体用户。我需要使用用户 ID 在 BD 中执行请求,以从该 BD 中的其他表获取任何信息。在 Spring Security
我使用 LocalContainerEntityManagerFactoryBean 来设置 JPA EntityManagerFactory。在我使用 setPackagesToScan 扫描的扫描
我是一名优秀的程序员,十分优秀!