Spring Security + JPA 用户架构

Dhe*_*rne 5 spring hibernate jpa spring-mvc spring-security

根据 Spring 文档,如果您需要通过数据库管理 Spring 安全性,您应该有一些标准的表架构。例如。

create table users(
    username varchar(256) not null primary key,
    password varchar(256) not null,
    enabled boolean not null
);

create table authorities (
    username varchar(256) not null,
    authority varchar(256) not null,
    constraint fk_authorities_users foreign key(username) references users(username)
);
create unique index ix_auth_username on authorities (username,authority);
Run Code Online (Sandbox Code Playgroud)

我面临的问题如下。1)无法理解如何使用 JPA 实现这种表模式?

我尝试过如下。

@Entity
@Table(name="USERS")
public class UsersPersistence extends Users implements Serializable{

    private static final long serialVersionUID = 1009548075747154488L;

    public UsersPersistence() {
        super();
    }

    public UsersPersistence(long id, String userName, String password, boolean enabled) {
        super(id, userName,password,enabled);
    }

    @Id
    @GeneratedValue
    @Column(name="id")
    @Override
    public long getId() {
        return super.getId();
    }

    @Column(name="username", nullable=false)
    @Override
    public String getUserName() {
        return super.getUserName();
    }

    @Column(name="password", nullable=false)
    @Override
    public String getPassword() {
        return super.getPassword();
    }

    @Column(name="enabled", nullable=false)
    @Override
    public boolean isEnabled() {
        return super.isEnabled();
    }

}
Run Code Online (Sandbox Code Playgroud)

该表是根据 Spring 文档架构中规定的要求创建的。理解上的问题是,当我尝试在权限表中的用户名上分配外键时。由于 JPA 通过父表(主键表)的 id 分配外键,或者可能我不知道如何分配它。

以下是产生问题的 JPA 类:-

@Entity
@Table(name="AUTHORITIES")
public class AuthoritiesPersistence extends Authorities implements Serializable{

    private static final long serialVersionUID = 1L;

    public AuthoritiesPersistence() {
        super();
    }

    public AuthoritiesPersistence(long id, UsersPersistence userName, String authority) {
        super(id,userName,authority);
    }

    @Id
    @GeneratedValue
    @Column(name="id")
    @Override
    public long getId() {
        return super.getId();
    }

    @Override
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="username", nullable=false)
    public UsersPersistence  getUserName() {
        return (UsersPersistence) super.getUserName();
    }

    @Column(name="authority", nullable=false)
    @Override
    public String getAuthority() {
        return super.getAuthority();
    }

}
Run Code Online (Sandbox Code Playgroud)

该表已成功创建,但 Spring 安全身份验证无法识别用户名,因为 JPA 使用外键 id 而不是实际用户名。

任何帮助将不胜感激。我真的很困于创建一个基于用户名而不是 ID 的外键。谢谢

zag*_*gyi 3

JdbcDaoImpl当使用默认值作为实现时,您只需要遵循 Spring Security 参考文档中给出的模式UserDetailsService,如果您的安全配置中有该标签,就是这种情况<jdbc-user-service>。即使这样,也可以覆盖它用来获取用户和权限的默认 SQL 查询(请参阅命名空间附录)。

但是,如果您使用 hibernate 管理用户帐户,那么编写您自己的实现是有意义的UserDetailsService,而不是尝试创建产生JdbcDaoImpl.

文档还指出:

如果您的应用程序确实使用 ORM 工具,您可能更愿意编写自定义 UserDetailsS​​ervice 来重用您可能已经创建的映射文件。