【问题标题】:User data not entirely stored in DB when using Spring Security使用 Spring Security 时用户数据未完全存储在 DB 中
【发布时间】:2013-07-06 10:09:31
【问题描述】:

我正在使用 Spring Security,用户通过 JDBC 存储在我的数据库中。 我也在使用 Spring MVC。

RegisteredUser 类:

@Entity
public class RegisteredUser extends User implements Serializable {

protected Long id;
private static final long serialVersionUID = -8500791712795093944L;
private String ssn;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
    return id;
}

public void setId(final Long id) {
    this.id = id;
}

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

    this.setSsn(ssn);
}

public String getSsn() {
    return ssn;
}

public void setSsn(String ssn) {
    this.ssn= ssn;
}
}

我的 security-config.xml 的一部分。数据库中存在“users”和“user_roles”表。

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"

            users-by-username-query="
                select username,password, enabled 
                from users where username=?"

            authorities-by-username-query="
                select u.username, ur.authority from users u, user_roles ur 
                where u.user_id = ur.user_id and u.username =?  " />
    </authentication-provider>
</authentication-manager>

当我尝试保存一个新用户时,我存储了 RegisteredUser 信息(即 ssn),但是用户表中没有插入任何条目,因此用户名和密码没有存储在数据库中,并且 RegisteredUser 的条目不是引用users 表中的任何条目。

我的保存方式是在 RegisteredUserRepository 类型的自动连线属性 registeredUserRepo 上调用 save:

@Repository
public interface RegisteredUserRepositoryextends
    PagingAndSortingRepository<RegisteredUser , Long> {

public RegisteredUser findByUsername(String username);
    }

在我的数据库中,我有这个:

--
-- Table structure for table `roles`
--

CREATE TABLE IF NOT EXISTS `roles` (
  `role_id` int(11) NOT NULL,
  `rolename` varchar(30) NOT NULL,
  PRIMARY KEY (`role_id`),
  UNIQUE KEY `rolename` (`rolename`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `roles` (`role_id`, `rolename`) VALUES
(1, 'ROLE_AMM'),
(2, 'ROLE_DIP'),
(3, 'ROLE_RES');

CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(10) unsigned NOT NULL,
  `username` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `user_roles` (
  `user_role_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `authority` varchar(45) NOT NULL,
  PRIMARY KEY (`user_role_id`),
  KEY `FK_user_roles` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `registereduser` (
  `DTYPE` varchar(31) NOT NULL,
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sn` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

我哪里错了?

【问题讨论】:

  • 所以,这个问题只是关于“无法使用 spring data 的PagingAndSortingRepository 创建一个新的RegisteredUser”?而且和spring security没有关系?如果是,请出示有关如何保存RegisteredUser 的代码
  • 我试图澄清这个问题:实际上,已存储有关 RegisteredUser 的信息。缺少的部分是用户名和密码,它们是 org.springframework.security.core.userdetails.User 类的一部分。另外,由于我是从 RegisteredUser 扩展这个类,我希望从 registeruser 表到用户表的外键类似,但什么都没有。
  • 最后,我还有一个类从 RegisteredUser 继承并添加了一个属性:该属性正确存储在数据库中(另一个表通过 id 引用 RegisteredUser)。所以,这就是为什么我认为问题与弹簧安全相关而不是弹簧数据的原因。

标签: database spring-security spring-data


【解决方案1】:

我解决了如下问题:

1) RegisteredUser 没有扩展 User 类,而是实现了 UserDetails 接口,并添加了 username、password、enabled、accountNonExpired、credentialsNonExpired 和 accountNonLocked。

2) 我创建了一个 BaseAuthority 来实现 GrantedAuthority 封装一个字符串角色(权限)。

3) 我将 1-n RegisteredUser 与 BaseAuthority 相关联

4) 我根据 Spring Data 派生的新持久性结构更改了安全配置中的查询,该结构基于我在 RegisteredUser 中的 Spring Data 注释(包括带有 Authorities 的 @OneToMany,也是一个托管 bean 实体)。

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 2012-08-29
    • 1970-01-01
    • 2011-06-04
    • 2015-12-04
    • 2016-03-20
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多