0

JDBC 経由でユーザーを DB に格納する Spring Security を使用しています。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 のエントリはエントリを参照していません。ユーザーテーブル。

保存する方法は、タイプ RegisteredUserRepository の autowired 属性 registeredUserRepo で保存を呼び出すことです。

@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 ;

どこが間違っていますか?

4

1 に答える 1

0

次のように問題を修正しました。

1) クラス User を拡張する代わりに、RegisteredUser はインターフェース UserDetails を実装し、username、password、enabled、accountNonExpired、credentialNonExpired、および accountNonLocked を追加します。

2) String ロール (権限) をカプセル化する GrantedAuthority を実装する BaseAuthority を作成しました。

3) 1-n RegisteredUser を BaseAuthority に関連付けました

4) RegisteredUser の Spring Data アノテーションに基づいて Spring Data によって導出された新しい永続性構造に従って、security-config のクエリを変更しました (Authorities を持つ @OneToMany とマネージド Bean エンティティを含む)。

于 2013-07-07T16:44:46.737 に答える