激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot整合Shiro實現登錄認證的方法

SpringBoot整合Shiro實現登錄認證的方法

2021-04-06 11:46stackfing Java教程

這篇文章主要介紹了SpringBoot整合Shiro實現登錄認證的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

安全無處不在,趁著放假讀了一下 Shiro 文檔,并記錄一下 Shiro 整合 Spring Boot 在數據庫中根據角色控制訪問權限

簡介

Apache Shiro是一個功能強大、靈活的,開源的安全框架。它可以干凈利落地處理身份驗證、授權、企業會話管理和加密。

SpringBoot整合Shiro實現登錄認證的方法

上圖是 Shiro 的基本架構

Authentication(認證)

有時被稱為“登錄”,用來證明用戶是用戶他們自己本人

Authorization(授權)

訪問控制的過程,即確定“誰”訪問“什么”

Session Management(會話管理)

管理用戶特定的會話,在 Shiro 里面可以發現所有的用戶的會話信息都會由 Shiro 來進行控制

Cryptography(加密)

在對數據源使用加密算法加密的同時,保證易于使用

Start

環境

Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Spring Data Jpa Lombok

添加依賴

這里只給出主要的 Shiro 依賴

?
1
2
3
4
5
<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-spring-boot-starter</artifactId>
  <version>1.4.0-RC2</version>
 </dependency>

配置

我們暫時只需要用戶表、角色表,在 Spring boot 中修改配置文件將自動為我們創建數據庫表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
server:
 port: 8888
spring:
 datasource:
 driver-class-name: com.mysql.jdbc.Driver
 username: root
 password: root
 url: jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8&useSSL=false
 jpa:
 generate-ddl: true
 hibernate:
  ddl-auto: update
 show-sql: true

實體

Role.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
@Entity
public class Role {
 
 @Id
 @GeneratedValue
 private Integer id;
 
 private Long userId;
 
 private String role;
 
}

User.java

?
1
2
3
4
5
6
7
8
9
10
11
12
@Data
@Entity
public class User {
 @Id
 @GeneratedValue
 private Long id;
 
 private String username;
 
 private String password;
 
}

Realm

首先建立 Realm 類,繼承自 AuthorizingRealm,自定義我們自己的授權和認證的方法。Realm 是可以訪問特定于應用程序的安全性數據(如用戶,角色和權限)的組件。

Realm.java

?
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
public class Realm extends AuthorizingRealm {
 
 @Autowired
 private UserService userService;
 
 //授權
 @Override
 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
 //從憑證中獲得用戶名
 String username = (String) SecurityUtils.getSubject().getPrincipal();
 //根據用戶名查詢用戶對象
 User user = userService.getUserByUserName(username);
 //查詢用戶擁有的角色
 List<Role> list = roleService.findByUserId(user.getId());
 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
 for (Role role : list) {
 //賦予用戶角色
 info.addStringPermission(role.getRole());
 }
 return info;
 }
 
 //認證
 @Override
 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
 
 //獲得當前用戶的用戶名
 String username = (String) authenticationToken.getPrincipal();
 
 //從數據庫中根據用戶名查找用戶
 User user = userService.getUserByUserName(username);
 if (userService.getUserByUserName(username) == null) {
 throw new UnknownAccountException(
  "沒有在本系統中找到對應的用戶信息。");
 }
 
 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(),getName());
 return info;
 }
 
}

Shiro 配置類

ShiroConfig.java

?
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
@Configuration
public class ShiroConfig {
 @Bean
 public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
 ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
 shiroFilterFactoryBean.setSecurityManager(securityManager);
 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
 //以下是過濾鏈,按順序過濾,所以/**需要放最后
 //開放的靜態資源
 filterChainDefinitionMap.put("/favicon.ico", "anon");//網站圖標
 filterChainDefinitionMap.put("/**", "authc");
 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
 return shiroFilterFactoryBean;
 }
 
@Bean
 public DefaultWebSecurityManager securityManager() {
 DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(myRealm());
 return defaultWebSecurityManager;
 }
 
 @Bean
 public MyRealm myRealm() {
 MyRealm myRealm = new MyRealm();
 return myRealm;
 }
}

控制器

UserController.java

?
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
@Controller
public class UserController {
 
 @Autowired
 private UserService userService;
 
 @GetMapping("/")
 public String index() {
 return "index";
 }
 
 @GetMapping("/login")
 public String toLogin() {
 return "login";
 }
 
 @GetMapping("/admin")
 public String admin() {
 return "admin";
 }
 
 @PostMapping("/login")
 public String doLogin(String username, String password) {
 UsernamePasswordToken token = new UsernamePasswordToken(username, password);
 Subject subject = SecurityUtils.getSubject();
 try {
 subject.login(token);
 } catch (Exception e) {
 e.printStackTrace();
 }
 return "redirect:admin";
 }
 
 @GetMapping("/home")
 public String home() {
 Subject subject = SecurityUtils.getSubject();
 try {
 subject.checkPermission("admin");
 } catch (UnauthorizedException exception) {
 System.out.println("沒有足夠的權限");
 }
 return "home";
 }
 
 @GetMapping("/logout")
 public String logout() {
 return "index";
 }
}

Service

UserService.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class UserService {
 
 @Autowired
 private UserDao userDao;
 
 public User getUserByUserName(String username) {
 return userDao.findByUsername(username);
 }
 
 @RequiresRoles("admin")
 public void send() {
 System.out.println("我現在擁有角色admin,可以執行本條語句");
 }
}

展示層

admin.html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>
 
<form action="/login" method="post">
 <input type="text" name="username" />
 <input type="password" name="password" />
 <input type="submit" value="登錄" />
</form>
</body>
</html>

home.html

?
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>
home
</body>
</html>

index.html

?
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>
index
<a href="/login" rel="external nofollow" >請登錄</a>
</body>
</html>

login.html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>
 
<form action="/login" method="post">
 <input type="text" name="username" />
 <input type="password" name="password" />
 <input type="submit" value="登錄" />
</form>
 
</body>
</html>

總結

這個小案例實現了根據角色來控制用戶訪問,其中最重要的就是 Realm,它充當了Shiro與應用安全數據間的“橋梁”或者“連接器”

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://my.oschina.net/u/3726481/blog/1621946

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩黄色影视 | 久久精品亚洲一区 | 色天使中文字幕 | 久久国产亚洲精品 | 成人毛片100免费观看 | av免费在线免费观看 | 一级国产免费 | 中文字幕欧美亚洲 | 性欧美videos另类极品 | 亚洲第一成人在线视频 | 国产精品久久久久久一区二区三区 | 久久国产精品二国产精品 | 日本在线播放一区二区三区 | 国产欧美精品综合一区 | 成人毛片100部 | 国产99久久精品一区二区300 | 精品国产一区二区三区成人影院 | 久久久精品视频在线观看 | 久久国产精品久久精品国产演员表 | 日韩一级视频 | 亚洲国产成人一区二区 | 欧美日韩亚洲不卡 | 国产精品久久久久久久亚洲按摩 | 亚洲视频精品在线 | 俄罗斯16一20sex牲色另类 | 国产成人自拍视频在线 | 蜜桃视频在线免费播放 | 午夜精品视频在线 | 一级毛片高清 | 不卡国产一区二区三区四区 | 狠狠干视频网站 | 欧美巨乳在线观看 | 亚洲精品无码不卡在线播放he | 欧美精品一区二区三区在线 | 黄色片免费在线 | 国产精品午夜一区 | av电影免费看| 黄色免费影片 | 国产免费久久久久 | 国产精品成人一区二区三区吃奶 | 国产精品色在线网站 |