gpt4 book ai didi

Spring Security + JPA 用户架构

转载 作者:行者123 更新时间:2023-12-03 23:31:32 24 4
gpt4 key购买 nike

根据 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);

我面临的问题如下。
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();
}

}

该表是根据 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();
}

}

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

任何帮助将是可观的。我真的坚持创建一个基于用户名而不是 id 的外键。
谢谢

最佳答案

当使用默认 JdbcDaoImpl 时,您只需要坚持 Spring Security 引用文档中给出的模式。如 UserDetailsService实现,如果您有 <jdbc-user-service> 就是这种情况在您的安全配置中标记。即使这样,也可以覆盖它用来获取用户和权限的默认 SQL 查询(请参阅 namespace appendix )。

但是,如果您使用 hibernate 管理用户帐户,则编写自己的 UserDetailsService 是有意义的。实现,而不是尝试创建导致 JdbcDaoImpl 所需的特定模式的 JPA 实体。 .

documentation还指出:

If your application does use an ORM tool, you might prefer to write a custom UserDetailsService to reuse the mapping files you've probably already created.

关于Spring Security + JPA 用户架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16414793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com