欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot整合Shiro實現(xiàn)登錄認證的方法

 更新時間:2018年02月22日 16:22:39   作者:stackfing  
這篇文章主要介紹了SpringBoot整合Shiro實現(xiàn)登錄認證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

簡介

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

上圖是 Shiro 的基本架構(gòu)

Authentication(認證)

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

Authorization(授權(quán))

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

Session Management(會話管理)

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

Cryptography(加密)

在對數(shù)據(jù)源使用加密算法加密的同時,保證易于使用

Start

環(huán)境

Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Spring Data Jpa Lombok

添加依賴

這里只給出主要的 Shiro 依賴

 <dependency>
   <groupId>org.apache.shiro</groupId>
   <artifactId>shiro-spring-boot-starter</artifactId>
   <version>1.4.0-RC2</version>
  </dependency>

配置

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

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

@Data
@Entity
public class Role {

 @Id
 @GeneratedValue
 private Integer id;

 private Long userId;

 private String role;

}

User.java

@Data
@Entity
public class User {
 @Id
 @GeneratedValue
 private Long id;

 private String username;

 private String password;

}

Realm

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

Realm.java

public class Realm extends AuthorizingRealm {

 @Autowired
 private UserService userService;
 
 //授權(quán)
 @Override
 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
 //從憑證中獲得用戶名
 String username = (String) SecurityUtils.getSubject().getPrincipal();
 //根據(jù)用戶名查詢用戶對象
 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 {

 //獲得當(dāng)前用戶的用戶名
 String username = (String) authenticationToken.getPrincipal();

 //從數(shù)據(jù)庫中根據(jù)用戶名查找用戶
 User user = userService.getUserByUserName(username);
 if (userService.getUserByUserName(username) == null) {
 throw new UnknownAccountException(
  "沒有在本系統(tǒng)中找到對應(yīng)的用戶信息。");
 }

 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(),getName());
 return info;
 }

}

Shiro 配置類

ShiroConfig.java

@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>();
 //以下是過濾鏈,按順序過濾,所以/**需要放最后
 //開放的靜態(tài)資源
 filterChainDefinitionMap.put("/favicon.ico", "anon");//網(wǎng)站圖標(biāo)
 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

@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("沒有足夠的權(quán)限");
 }
 return "home";
 }

 @GetMapping("/logout")
 public String logout() {
 return "index";
 }
}

Service

UserService.java

@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("我現(xiàn)在擁有角色admin,可以執(zhí)行本條語句");
 }
}

展示層

admin.html

<!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

<!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

<!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

<!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>

總結(jié)

這個小案例實現(xiàn)了根據(jù)角色來控制用戶訪問,其中最重要的就是 Realm,它充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java快速實現(xiàn)短信登錄的詳細流程

    Java快速實現(xiàn)短信登錄的詳細流程

    短信登錄是基于短信驗證碼的身份驗證方式,在許多網(wǎng)站和應(yīng)用中被廣泛使用,通常被認為比傳統(tǒng)的用戶名和密碼更安全,因為驗證碼是一次性使用的,且只有用戶能夠接收到短信,本文給大家介紹了Java快速實現(xiàn)短信登錄的詳細流程,需要的朋友可以參考下
    2025-08-08
  • Java數(shù)據(jù)結(jié)構(gòu)之LinkedList從鏈表到實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之LinkedList從鏈表到實現(xiàn)

    LinkedList是Java中常用的數(shù)據(jù)結(jié)構(gòu)之一,實現(xiàn)了鏈表的特性,支持快速添加、刪除元素,可以用于實現(xiàn)隊列、棧、雙向隊列等數(shù)據(jù)結(jié)構(gòu)。LinkedList的內(nèi)部實現(xiàn)采用了雙向鏈表,其中每個節(jié)點都包含前驅(qū)節(jié)點和后繼節(jié)點的引用,可以直接訪問鏈表的頭尾元素
    2023-04-04
  • Java算法篇之BF與KMP算法深入講解

    Java算法篇之BF與KMP算法深入講解

    BF算法和KMP算法都是串的模式匹配算法,但是它們的時間復(fù)雜度不同,下面這篇文章主要介紹了Java算法篇之BF與KMP算法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-07-07
  • java基本教程之線程休眠 java多線程教程

    java基本教程之線程休眠 java多線程教程

    本文對javaThread中sleep()方法進行介紹,sleep() 的作用是讓當(dāng)前線程休眠,即當(dāng)前線程會從“運行狀態(tài)”進入到“休眠(阻塞)狀態(tài)”,大家參考使用吧
    2014-01-01
  • HashMap 和 HashSet的區(qū)別

    HashMap 和 HashSet的區(qū)別

    本文主要介紹HashMap 和 HashSet的區(qū)別,這里整理了詳細的資料來說名兩者的區(qū)別,并說明如何使用該方法,有需要的小伙伴可以參考下
    2016-09-09
  • Maven實戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)

    Maven實戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)

    本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 深入了解Java設(shè)計模式之UML類圖

    深入了解Java設(shè)計模式之UML類圖

    UML?即?Unified?Modeling?Language?統(tǒng)一建模語言,是用來設(shè)計軟件的可視化建模語言。本文就帶大家了解一下UML中類圖的定義與使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • mybatis攔截器注冊初始化編寫示例及如何生效詳解

    mybatis攔截器注冊初始化編寫示例及如何生效詳解

    這篇文章主要為大家介紹了mybatis攔截器注冊初始化編寫示例及如何生效詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java字符串?dāng)?shù)組的創(chuàng)建代碼示例

    Java字符串?dāng)?shù)組的創(chuàng)建代碼示例

    這篇文章主要介紹了Java中字符串?dāng)?shù)組的聲明、初始化、默認值、遍歷和常見操作,文中通過代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2025-03-03
  • sql于navicat中能運行在mybatis中不能運行的解決方案

    sql于navicat中能運行在mybatis中不能運行的解決方案

    這篇文章主要介紹了sql于navicat中能運行在mybatis中不能運行的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論