- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Spring Security+Spring Data Jpa如何进行安全管理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
为了操作简单,我这里引入 Spring Data Jpa 来帮助我们完成数据库操作 。
1.创建工程 。
首先我们创建一个新的 Spring Boot 工程,添加如下依赖:
注意,除了 Spring Security 依赖之外,我们还需要数据依赖和 Spring Data Jpa 依赖.
工程创建完成后,我们再在数据库中创建一个空的库,就叫做 withjpa,里边什么都不用做,这样我们的准备工作就算完成了.
2.准备模型 。
接下来我们创建两个实体类,分别表示用户角色了用户类:
用户角色:
1
2
3
4
5
6
7
8
9
|
@Entity
(name =
"t_role"
)
public
class
Role {
@Id
@GeneratedValue
(strategy = GenerationType.IDENTITY)
private
Long id;
private
String name;
private
String nameZh;
//省略 getter/setter
}
|
这个实体类用来描述用户角色信息,有角色 id、角色名称(英文、中文),@Entity 表示这是一个实体类,项目启动后,将会根据实体类的属性在数据库中自动创建一个角色表.
用户实体类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
@Entity
(name =
"t_user"
)
public
class
User
implements
UserDetails {
@Id
@GeneratedValue
(strategy = GenerationType.IDENTITY)
private
Long id;
private
String username;
private
String password;
private
boolean
accountNonExpired;
private
boolean
accountNonLocked;
private
boolean
credentialsNonExpired;
private
boolean
enabled;
@ManyToMany
(fetch = FetchType.EAGER,cascade = CascadeType.PERSIST)
private
List<Role> roles;
@Override
public
Collection<?
extends
GrantedAuthority> getAuthorities() {
List<SimpleGrantedAuthority> authorities =
new
ArrayList<>();
for
(Role role : getRoles()) {
authorities.add(
new
SimpleGrantedAuthority(role.getName()));
}
return
authorities;
}
@Override
public
String getPassword() {
return
password;
}
@Override
public
String getUsername() {
return
username;
}
@Override
public
boolean
isAccountNonExpired() {
return
accountNonExpired;
}
@Override
public
boolean
isAccountNonLocked() {
return
accountNonLocked;
}
@Override
public
boolean
isCredentialsNonExpired() {
return
credentialsNonExpired;
}
@Override
public
boolean
isEnabled() {
return
enabled;
}
//省略其他 get/set 方法
}
|
用户实体类主要需要实现 UserDetails 接口,并实现接口中的方法.
这里的字段基本都好理解,几个特殊的我来稍微说一下:
3.配置 。
数据模型准备好之后,我们再来定义一个 UserDao:
1
2
3
|
public
interface
UserDao
extends
JpaRepository<User,Long> {
User findUserByUsername(String username);
}
|
这里的东西很简单,我们只需要继承 JpaRepository 然后提供一个根据 username 查询 user 的方法即可.
在接下来定义 UserService ,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Service
public
class
UserService
implements
UserDetailsService {
@Autowired
UserDao userDao;
@Override
public
UserDetails loadUserByUsername(String username)
throws
UsernameNotFoundException {
User user = userDao.findUserByUsername(username);
if
(user ==
null
) {
throw
new
UsernameNotFoundException(
"用户不存在"
);
}
return
user;
}
}
|
我们自己定义的 UserService 需要实现 UserDetailsService 接口,实现该接口,就要实现接口中的方法,也就是 loadUserByUsername ,这个方法的参数就是用户在登录的时候传入的用户名,根据用户名去查询用户信息(查出来之后,系统会自动进行密码比对).
配置完成后,接下来我们在 Spring Security 中稍作配置,Spring Security 和测试用的 HelloController 我还是沿用之前文章中的(Spring Security 如何将用户数据存入数据库?),主要列出来需要修改的地方.
在 SecurityConfig 中,我们通过如下方式来配置用户:
1
2
3
4
5
6
|
@Autowired
UserService userService;
@Override
protected
void
configure(AuthenticationManagerBuilder auth)
throws
Exception {
auth.userDetailsService(userService);
}
|
大家注意,还是重写 configure 方法,只不过这次我们不是基于内存,也不是基于 JdbcUserDetailsManager,而是使用自定义的 UserService,就这样配置就 OK 了.
最后,我们再在 application.properties 中配置一下数据库和 JPA 的基本信息,如下:
1
2
3
4
5
6
7
8
9
|
spring.datasource.username=root
spring.datasource.password=
123
spring.datasource.url=jdbc:mysql:
///withjpa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=
true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
|
都是常规配置,我们就不再重复解释了.
这一套组合拳下来,我们的 Spring Security 就算是接入数据库了,接下来我们来进行测试 。
4.测试 。
首先我们来添加两条测试数据,在单元测试中添加如下方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@Autowired
UserDao userDao;
@Test
void
contextLoads() {
User u1 =
new
User();
u1.setUsername(
"javaboy"
);
u1.setPassword(
"123"
);
u1.setAccountNonExpired(
true
);
u1.setAccountNonLocked(
true
);
u1.setCredentialsNonExpired(
true
);
u1.setEnabled(
true
);
List<Role> rs1 =
new
ArrayList<>();
Role r1 =
new
Role();
r1.setName(
"ROLE_admin"
);
r1.setNameZh(
"管理员"
);
rs1.add(r1);
u1.setRoles(rs1);
userDao.save(u1);
User u2 =
new
User();
u2.setUsername(
"江南一点雨"
);
u2.setPassword(
"123"
);
u2.setAccountNonExpired(
true
);
u2.setAccountNonLocked(
true
);
u2.setCredentialsNonExpired(
true
);
u2.setEnabled(
true
);
List<Role> rs2 =
new
ArrayList<>();
Role r2 =
new
Role();
r2.setName(
"ROLE_user"
);
r2.setNameZh(
"普通用户"
);
rs2.add(r2);
u2.setRoles(rs2);
userDao.save(u2);
}
|
运行该方法后,我们会发现数据库中多了三张表:
这就是根据我们的实体类自动创建出来的.
我们来查看一下表中的数据.
用户表:
角色表:
用户和角色关联表:
有了数据,接下来启动项目,我们来进行测试.
我们首先以 江南一点雨的身份进行登录:
登录成功后,分别访问 /hello,/admin/hello 以及 /user/hello 三个接口,其中:
具体测试效果小伙伴们可以参考松哥的视频,我就不截图了.
在测试的过程中,如果在数据库中将用户的 enabled 属性设置为 false,表示禁用该账户,此时再使用该账户登录就会登录失败.
按照相同的方式,大家也可以测试 javaboy 用户.
好了,今天就和小伙伴们说这么多. 。
以上就是Spring Security+Spring Data Jpa如何进行安全管理的详细内容,更多关于Spring Security+Spring Data Jpa 安全管理的资料请关注我其它相关文章! 。
原文链接:https://segmentfault.com/a/1190000022388336 。
最后此篇关于Spring Security+Spring Data Jpa如何进行安全管理的文章就讲到这里了,如果你想了解更多关于Spring Security+Spring Data Jpa如何进行安全管理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
只是想知道这些结构之间有什么区别(text、data、rodata、bss 等)在链接描述文件中: .data : { *(.data) } .data : { *(.data*) }
Data 定义为其核心功能之一 gfoldl : gfoldl :: (Data a) => (forall d b. Data d => c (d -> b) -> d -> c b)
以下之间有什么区别:data-sly-use、data-sly-resource、data-sly-include 和 数据-sly-模板?我正在阅读 Sightly AEM 上的文档,我非常困惑。
我有一个 Spring Boot、Spring Data JPA (hibernate) Web 应用程序,并且想引入文本搜索功能。 我理解以下内容 hibernate search 或 spring
我不知道我的代码有什么问题。我读了其他有同样问题的人的一些问题,但没有找到答案。当我尝试编译时出现以下错误: ||In function 'main':| |35|error: expected ex
我不太确定为什么会收到此错误或其含义。我的数据框称为“数据”。 library(dplyr) data %>% filter(Info==1, Male==1) %>% lm(CFL_
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
我正在通过 this project 在 Android 上摆弄 node.js ,我需要一种方法将 js 文件部署到私有(private)目录(以隐藏源代码,防止用户篡改),该目录也物理存在于文件系
大家好我有点沮丧,所以我希望得到一些帮助。我的项目在 SwiftUI 中。我想使用图像选择器将图像保存到 Core Data。我实现了让 ImagePicker 工作,但我正在努力转换 Image -
我有以下数据和代码: mydf grp categ condition value 1 A X P 2 2 B X P 5
我一直在努力解决这个问题,但我根本找不到任何解决问题的方法。希望这里有人可以提供帮助。 我正在尝试为具有以下结构的某些数据创建个人选择矩阵: # A tibble: 2,152 x 32 a
我了解 Data.Map.Lazy 和 Data.Map.Strict 是不同的。但是,当您导入 Data.Map 时,您究竟导入了什么:严格的、惰性的还是两者的组合? 最佳答案 懒人。看着docs
我正在开发一个 C 程序,用于从 BerkeleyDB DBTree 数据库中提取数据值与特定模式匹配的记录。我创建数据库,打开它,将键的 DBT 和数据的另一个 DBT 清零,将 DBT 标志设置为
所以我有以下成员(member)历史表 User_ID | Start date | End Date | Type(0-7) | ---------------------------
随着最近推出的包dataframe ,我认为是时候正确地对各种数据结构进行基准测试,并突出每种数据结构的优势。我不是每个人的不同优势的专家,所以我的问题是,我们应该如何对它们进行基准测试。 我尝试过的
我有来自 API 的数据,但无法将数组中的数据设置为 vue.js 中的 this.data这是来自 API 的数据(JSON) 你能告诉我这个语法吗 {"id":1613, "name_org":"
在 Vue.js到目前为止,我已经找到了两种定义数据的方法:data: {} 和 data() { return; }. data: { defaultLayout: 'default' }
我正在研究Spring Data Rest Services,并在自定义拦截器中遇到一些问题。之前我使用spring-data-rest-webmvc 2.2.0并以以下方式添加了拦截器。 publi
我是一名优秀的程序员,十分优秀!