Spring Boot與Shiro整合實現用戶認證

2020-12-25 黑馬程式設計師

1.1. 分析Shiro的核心API

Subject: 用戶主體(把操作交給SecurityManager)

SecurityManager:安全管理器(關聯Realm)

Realm:Shiro連接數據的橋梁

1.2. Spring Boot整合Shiro

1.2.1. 導入shiro與spring整合依賴

修改pom.xml

<!-- shiro與spring整合依賴 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency>

1.2.2. 自定義Realm類

package com.itheima.shiro;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;/*** 自定義Realm * @author lenovo * */public class UserRealm extends AuthorizingRealm{/** * 執行授權邏輯 */@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {System.out.println("執行授權邏輯");return null;}/** * 執行認證邏輯 */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {System.out.println("執行認證邏輯");return null;}}

1.2.3. 編寫Shiro配置類(*)

package com.itheima.shiro;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/*** Shiro的配置類 * @author lenovo * */@Configurationpublic class ShiroConfig {/** * 創建ShiroFilterFactoryBean */ @Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();//設置安全管理器shiroFilterFactoryBean.setSecurityManager(securityManager);return shiroFilterFactoryBean;}/** * 創建DefaultWebSecurityManager */@Bean(name="securityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();//關聯realmsecurityManager.setRealm(userRealm);return securityManager;}/** * 創建Realm */@Bean(name="userRealm")public UserRealm getRealm(){return new UserRealm();}}

1.3. 使用Shiro內置過濾器實現頁面攔截

package com.itheima.shiro;import java.util.LinkedHashMap;import java.util.Map;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/*** Shiro的配置類 * @author lenovo * */@Configurationpublic class ShiroConfig {/** * 創建ShiroFilterFactoryBean */@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();//設置安全管理器shiroFilterFactoryBean.setSecurityManager(securityManager);//添加Shiro內置過濾器/** * Shiro內置過濾器,可以實現權限相關的攔截器 * 常用的過濾器: * anon: 無需認證(登錄)可以訪問 * authc: 必須認證才可以訪問 * user: 如果使用rememberMe的功能可以直接訪問 * perms: 該資源必須得到資源權限才可以訪問 * role: 該資源必須得到角色權限才可以訪問 */Map<String,String> filterMap = new LinkedHashMap<String,String>();/*filterMap.put("/add", "authc");filterMap.put("/update", "authc");*/filterMap.put("/testThymeleaf", "anon");filterMap.put("/*", "authc");//修改調整的登錄頁面shiroFilterFactoryBean.setLoginUrl("/toLogin");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);return shiroFilterFactoryBean;}/** * 創建DefaultWebSecurityManager */@Bean(name="securityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();//關聯realmsecurityManager.setRealm(userRealm);return securityManager;}/** * 創建Realm */@Bean(name="userRealm")public UserRealm getRealm(){return new UserRealm();}}

1.4. 實現用戶認證(登錄)操作

1.4.1. 設計登錄頁面

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>登錄頁面</title></head><body><h3>登錄</h3><form method="post" action="login">用戶名:<input type="text" name="name"/><br/>密碼:<input type="password" name="password"/><br/><input type="submit" value="登錄"/></form></body></html>

1.4.2. 編寫Controller的登錄邏輯

/*** 登錄邏輯處理 */@RequestMapping("/login")public String login(String name,String password,Model model){/** * 使用Shiro編寫認證操作 *///1.獲取SubjectSubject subject = SecurityUtils.getSubject();//2.封裝用戶數據UsernamePasswordToken token = new UsernamePasswordToken(name,password);//3.執行登錄方法try {subject.login(token);//登錄成功//跳轉到test.htmlreturn "redirect:/testThymeleaf";} catch (UnknownAccountException e) {//e.printStackTrace();//登錄失敗:用戶名不存在model.addAttribute("msg", "用戶名不存在");return "login";}catch (IncorrectCredentialsException e) {//e.printStackTrace();//登錄失敗:密碼錯誤model.addAttribute("msg", "密碼錯誤");return "login";}}

1.4.3. 編寫Realm的判斷邏輯

package com.itheima.shiro;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;/*** 自定義Realm * @author lenovo * */public class UserRealm extends AuthorizingRealm{/** * 執行授權邏輯 */@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {System.out.println("執行授權邏輯");return null;}/** * 執行認證邏輯 */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {System.out.println("執行認證邏輯");//假設資料庫的用戶名和密碼String name = "eric";String password = "123456";//編寫shiro判斷邏輯,判斷用戶名和密碼//1.判斷用戶名UsernamePasswordToken token = (UsernamePasswordToken)arg0;if(!token.getUsername().equals(name)){//用戶名不存在return null;//shiro底層會拋出UnKnowAccountException}//2.判斷密碼return new SimpleAuthenticationInfo("",password,"");}}

1.5. 整合MyBatis實現登錄

1.5.1. 導入mybatis相關的依賴

<!-- 導入mybatis相關的依賴 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- SpringBoot的Mybatis啟動器 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version></dependency>

1.5.2. 配置application.properties

位置:src/main/resources目錄下

spring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/testspring.datasource.username=rootspring.datasource.password=rootspring.datasource.type=com.alibaba.druid.pool.DruidDataSourcemybatis.type-aliases-package=com.itheima.domain

1.5.3. 編寫User實體

package com.itheima.domain;public class User {private Integer id;private String name;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

1.5.4. 編寫UserMapper接口

package com.itheima.mapper;import com.itheima.domain.User;public interface UserMapper {public User findByName(String name);}

1.5.5. 編寫UserMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 該文件存放CRUD的sql語句 --><mapper namespace="com.itheima.mapper.UserMapper"><select id="findByName" parameterType="string" resultType="user">SELECT id,NAME,PASSWORDFROMuser where name = #{value}</select></mapper>

1.5.6. 編寫業務接口和實現

接口:

package com.itheima.service;import com.itheima.domain.User;public interface UserService {public User findByName(String name);}

實現;

package com.itheima.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.itheima.domain.User;import com.itheima.mapper.UserMapper;import com.itheima.service.UserService;@Servicepublic class UserServiceImpl implements UserService{//注入Mapper接口@Autowiredprivate UserMapper userMapper;@Overridepublic User findByName(String name) {return userMapper.findByName(name);}}

1.5.7. 添加@MapperScan註解

package com.itheima;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/*** SpringBoot啟動類 * @author lenovo * */@SpringBootApplication@MapperScan("com.itheima.mapper")public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

1.5.8. 修改UserRealm

package com.itheima.shiro;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.springframework.beans.factory.annotation.Autowired;import com.itheima.domain.User;import com.itheima.service.UserService;/*** 自定義Realm * @author lenovo * */public class UserRealm extends AuthorizingRealm{/** * 執行授權邏輯 */@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {System.out.println("執行授權邏輯");return null;}@Autowiredprivate UserService userSerivce;/** * 執行認證邏輯 */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {System.out.println("執行認證邏輯");//編寫shiro判斷邏輯,判斷用戶名和密碼//1.判斷用戶名UsernamePasswordToken token = (UsernamePasswordToken)arg0;User user = userSerivce.findByName(token.getUsername());if(user==null){//用戶名不存在return null;//shiro底層會拋出UnKnowAccountException}//2.判斷密碼return new SimpleAuthenticationInfo("",user.getPassword(),"");}}

相關焦點

  • 學習學習SpringSecurity
    Spring Security思維導圖簡介SpringSecurity是Spring下的一個安全框架,與shiro 類似,一般用於用戶認證(Authentication)和用戶授權(Authorization)兩個部分,常與與SpringBoot相整合。
  • springboot+springsecurity實現前後端分離簡單實現!
    中根據用戶輸入的用戶名、密碼構建了 UsernamePasswordAuthenticationToken,並將其交給 AuthenticationManager 來進行認證處理。AuthenticationManager 本身不包含認證邏輯,其核心是用來管理所有的 AuthenticationProvider,通過交由合適的 AuthenticationProvider 來實現認證。
  • 如何用Spring Boot和Cloud實現微服務
    如何用Spring Boot和Cloud實現微服務 本文將向您介紹如何使用Spring Boot和Cloud來實現微服務的基本部署和相互通信。
  • Spring Boot 2.4 正式發布,重大調整!!!
    更多細節可參考:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide如果你想繼續使用 Spring Boot 2.3 的配置邏輯,也可以通過在
  • Spring boot + Spring Security實現權限管理
    基於Spring boot + Spring Security實現第一版傳統架構本文是實訓邦的權限管理SpringSecurity+JWT的一個講義,分享給粉絲學習。Httpbasic模式的登錄認證啟動運行項目之後,我們可以看到無需任何配置就實現了登錄認證功能,這個就是SpringSecurity的Httpbasic模式。
  • Shiro 權限校驗分析
    Authorization:授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限; 即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限。
  • Spring Boot集成validation用於優雅的校驗API參數的合法性
    validation主要是校驗用戶提交的數據的合法性,比如是否為空,密碼是否符合規則,郵箱格式是否正確等等,校驗框架比較多,用的比較多的是hibernate-validator, 也支持國際化,也可以自定義校驗類型的註解,這裡只是簡單的演示校驗框架在Spring Boot中的簡單集成
  • Spring Boot+Maven+JPA+Shiro+Easyui實現通用用戶權限管理系統
    設計思路源於經典的RBAC模型,即:用戶通過角色操作資源。在實現上,基本實現了功能權限,包含了資源菜單的顯示控制以及頁面上按鈕粒度的顯示控制。並且附送了使用Springboot發送郵件的功能。Shiro + Easyuijar包文件用SpringBoot,Maven自動下載項目截圖注意事項1.啟動後會自動新建表,但是需要實現新建資料庫才可以
  • Spring Boot 2.3.0 發布 - OSCHINA - 中文開源技術交流社區
    > Couchbase Client 3.0 Elasticsearch 7.6 Kafka 2.5 Micrometer 1.5 MongoDB 4.0 支持 Java 14spring
  • Spring Boot 2.4.3、2.3.9 版本發布,你準備好了嗎?
    心急的小夥伴現在可從 repo.spring.io 和 Maven Central 獲得相關內容。<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.4.3</version>
  • Spring Boot 節省95%內存佔用
    /gu install native-image初始化 Spring Boot 2.4 項目Spring Initializr 創建 demo 項目curl https://start.spring.io/starter.zip -d dependencies=web \ -d bootVersion
  • Spring Security(二)--Guides
    作者:老徐原文地址:https://www.cnkirito.moe/2017/09/20/spring-security-2/友情提示:歡迎關注公眾號【芋道源碼】。😈關注後,拉你進【源碼圈】微信群和【老徐】搞基嗨皮。友情提示:歡迎關注公眾號【芋道源碼】。
  • SpringBoot整合Spring Security
    提供了完善的認證機制和方法級的授權功能。是一款非常優秀的權限管理框架。它的核心是一組過濾器鏈,不同的功能經由不同的過濾器。這篇文章就是想通過一個小案例將Spring Security整合到SpringBoot中去。要實現的功能就是在認證伺服器上登錄,然後獲取Token,再訪問資源伺服器中的資源。
  • Apache Shiro反序化識別那些事
    1.1 關於Apache ShiroApache shiro是一個Java安全框架,提供了認證、授權、加密和會話管理功能,為解決應安全提供了相應的API:1.認證-用戶身份識別,常被稱為用戶」登錄」>2.授權-訪問控制3.密碼加密-保護或隱藏數據防止被偷窺4.會話管理-用戶相關的時間敏感的狀態1.2 Shiro反序列化1.2.1 反序列化漏
  • 「網絡安全」關於Apache Shiro權限繞過高危漏洞的 預警通報
    由於shiro在處理url時與spring存在差異,處理身份驗證請求時出錯導致存在身份校驗繞過漏洞,遠程攻擊者可以發送特製的HTTP請求,繞過身份驗證過程並獲得對應用程式的未授權訪問。二、影響範圍 Apache Shiro < 1.6.0。
  • Spring boot 按需啟用組件Bean
    所以我們就利用了ConditionalOnProperty註解,實現了定製化,可以開、關業務組件。比如我需要發郵件的時候,我就配置文件加一項,如果不需要,就關掉。我們看一下配置長什麼樣子,在application.yml配置中這裡有個JDBC配置, 現在是開啟狀態。
  • SSM框架集成之用戶登錄功能的實現
    咱們已經分享了Spring Mybatis SpringMVC 三個框架今天來把這三個框架整合一下還記得之前又給大家分享過整合 Spring Mybatis 框架的項目,今天就在那個項目的基礎上,來把 springMVC 整合進去 SSM框架的整合
  • Shiro的授權和Session管理(三)
    注意,對角色和權限驗證之前,必須要進行認證, 已經登錄成功的用戶才可能查詢出相應的角色和權限。首先,老蝴蝶先講解一下角色,再講解一下權限。獲取當前登錄的用戶 Subject subject=SecurityUtils.getSubject(); //5.
  • springcloud的微服務開發日記之五(zuul路由轉發)
    2018年的日程安排如下:記錄springcloud開發微服務的全過程記錄vue實現的知識圖譜服務記錄中醫理論在知識圖譜上的應用每天一個小目標,做比昨天更好的自己博客地址 i.drai.top有興趣的可以關注一下,共同進步另:關注後可點擊頭條號的「源碼」連結,有空閒時間我會不定期的上傳源碼以供參考