【问题标题】:Spring Security add attributes through implementing UserDetailsServiceSpring Security 通过实现 UserDetailsS​​ervice 添加属性
【发布时间】:2014-09-29 10:03:33
【问题描述】:

我是 Spring Security 新手,在向核心(spring Security)用户类添加新属性时遇到问题。

我已对其进行了扩展并实现了自己的 UserDetailsS​​ervice 版本,但在尝试登录时收到错误消息

您的登录失败。 引起:org.springframework.orm.jpa.JpaSystemException:没有实体的默认构造函数::com.webshop.model.Shopper;嵌套异常是 org.hibernate.InstantiationException: No default constructor for entity: : com.webshop.model.Shopper

我自己的用户扩展:

@Entity
@Table(name = "users")
public class Shopper extends User{

    private static final long serialVersionUID = -7060154441729348386L;

    @Id
    private String username;

    @Column(name = "budget")
    private int budget;

    @OneToMany(mappedBy = "users",fetch = FetchType.EAGER, cascade=CascadeType.PERSIST)
    private List<Sales> sales = new ArrayList<Sales>();

    @OneToMany(mappedBy = "users",fetch = FetchType.EAGER)
    private List<Items> items = new ArrayList<Items>();

    @Column(name="enabled")
    private boolean enabled;

    public Shopper(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired,
            boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
    }

    public Shopper(String username, String password, Collection<? extends GrantedAuthority> authorities) {
        super(username, password, authorities);
    }

//getters and setters
}

我的用户详细信息服务

@Service("usersService")
public class UserServiceImpl implements UsersService, UserDetailsService {
    @Autowired
    private UserRepository usersRepository;

    @Override
    public Shopper find(String username) {
        return usersRepository.findOne(username);
    }

    @Override
    public Shopper save(Shopper user) {
        return usersRepository.save(user);
    }

    @Autowired
    private UserRepository userRepository;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        try {
            Shopper domainUser = userRepository.findOne(username);
            boolean enabled = true;
            boolean accountNonExpired = true;
            boolean credentialsNonExpired = true;
            boolean accountNonLocked = true;
            return new User(domainUser.getUsername(), domainUser.getPassword().toLowerCase(), enabled, accountNonExpired, credentialsNonExpired,
                    accountNonLocked,domainUser.getAuthorities());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

最后是我的安全配置 xml

<http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login.html" access="isAnonymous()"/>
        <intercept-url pattern="/loginFailed.html" access="isAnonymous()"/>
        <intercept-url pattern="/logout.html" access="isAnonymous()"/>
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <form-login login-page="/login.html" authentication-failure-url="/loginFailed.html"/>
        <logout logout-success-url="/"/>
    </http>

    <beans:bean id="UserServiceImpl" class="com.webshop.service.UserServiceImpl" />
    <authentication-manager>
        <authentication-provider user-service-ref="UserServiceImpl">
            <!-- <password-encoder hash="bcrypt" /> -->
            <!-- <jdbc-user-service data-source-ref="dataSource" />  -->
        </authentication-provider>

    </authentication-manager>

    <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <beans:property name="url" value="jdbc:mysql://localhost:3306/webshop" />
        <beans:property name="username" value="root" />
        <beans:property name="password" value="root" />
    </beans:bean>

【问题讨论】:

  • 错误信息一目了然。实体没有默认构造函数:com.webshop.model.Shopper。

标签: java hibernate spring-mvc jpa spring-security


【解决方案1】:

错误消息是明确的:No default constructor for entity: com.webshop.model.Shopper

你应该添加一个默认构造函数:

public Shopper() {
    super();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 2018-10-25
    • 2013-05-12
    • 2012-12-25
    • 2012-06-11
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多