spring boot整合shiro安全框架過(guò)程解析
這篇文章主要介紹了spring boot整合shiro安全框架過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
題記:在學(xué)習(xí)了springboot和thymeleaf之后,想完成一個(gè)項(xiàng)目練練手,于是使用springboot+mybatis和thymeleaf完成一個(gè)博客系統(tǒng),在完成的過(guò)程中出現(xiàn)的一些問(wèn)題,將這些問(wèn)題記錄下來(lái),作為自己的學(xué)習(xí)心得。在這先感謝群主TyCoding的Tumo項(xiàng)目,雖然本人實(shí)在太菜了,好些地方看不懂,但還是使我受益匪淺。
shiro作為一個(gè)小巧靈活的安全框架,在認(rèn)證和授權(quán)方面簡(jiǎn)約但又不簡(jiǎn)單,十分容易上手使用。下面是整合shiro的具體流程。
1.添加依賴
<!--shiro和spring整合-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--shiro核心包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
2.在springboot控制臺(tái)中添加基礎(chǔ)包的掃描和實(shí)體類的掃描注解
由于本人實(shí)在粗心,用try,catch將這個(gè)錯(cuò)誤包起來(lái)了,所以找了一個(gè)下午的bug才發(fā)現(xiàn)。如果是用ssm整合shiro也大致一樣,只不過(guò)需要在web.xml中添加一些配置信息。
具體流程大同小異。
@SpringBootApplication(scanBasePackages = "cn.zhq")
@EntityScan("cn.zhq.system.entity")
public class MyBlogApplication {
public static void main(String[] args) {
SpringApplication.run(MyBlogApplication.class);
}
}
3.自定義realm域
個(gè)人覺(jué)得realm就相當(dāng)于一個(gè)數(shù)據(jù)源 ,shiro從realm中去獲取一些數(shù)據(jù),驗(yàn)證用戶的認(rèn)證和授權(quán)。
3.1 usermapper接口
@Mapper
public interface UserMapper {
/**
* 根據(jù)Name查詢用戶數(shù)據(jù)
*/
SysUser findByName(String username);
}
3.2 配置文件usermapper.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.zhq.system.mapper.UserMapper">
<select id="findByName" resultType="sysuser" parameterType="String">
select * from tb_user where username = #{username}
</select>
</mapper>
3.3 編寫自定義realm并繼承AuthorizingRealm
這里只貼出認(rèn)證的方法。
@Autowired
private UserMapper userMapper;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//1.獲取登錄的用戶名密碼(token)
UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;
String username = upToken.getUsername();
String password = new String( upToken.getPassword());
//2.根據(jù)用戶名查詢數(shù)據(jù)庫(kù)
SysUser user = userMapper.findByName(username);
//3.判斷用戶是否存在或者密碼是否一致
if(user != null && user.getPassword().equals(password)) {
//4.如果一致返回安全數(shù)據(jù)
//構(gòu)造方法:安全數(shù)據(jù),密碼,realm域名
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),this.getName());
return info;
}
//5.不一致,返回null(拋出異常)
return null;
}
4.編寫shiro配置類
4.1 安全管理器
//配置自定義的Realm
@Bean
public AuthRealm getRealm() {
return new AuthRealm();
}
//配置安全管理器
@Bean
public SecurityManager securityManager(AuthRealm realm) {
//使用默認(rèn)的安全管理器
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(realm);
//將自定義的realm交給安全管理器統(tǒng)一調(diào)度管理
securityManager.setRealm(realm);
return securityManager;
}
4.2 配置過(guò)濾器工廠
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
//1.創(chuàng)建過(guò)濾器工廠
ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean();
//2.設(shè)置安全管理器
filterFactory.setSecurityManager(securityManager);
//3.通用配置(跳轉(zhuǎn)登錄頁(yè)面,為授權(quán)跳轉(zhuǎn)的頁(yè)面)
filterFactory.setLoginUrl("#");//跳轉(zhuǎn)url地址
filterFactory.setUnauthorizedUrl("#");//未授權(quán)的url
return filterFactory;
}
5. 編寫controller方法
@RequestMapping(value="/login")
@ResponseBody
public String login(String username,String password) {
try{
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken uptoken = new UsernamePasswordToken(username,password);
subject.login(uptoken);
return "登錄成功";
}catch (Exception e) {
return "用戶名或密碼錯(cuò)誤";
}
}
6.登陸
6.1 獲取md5加密的密碼
由于密碼是使用shiro提供的Md5加密方式。為了避免麻煩就直接打印加密之后的密碼。
Md5Hash的參數(shù)代表的含義分別是 加密的內(nèi)容 | 鹽(加密的混淆字符串) | 加密次數(shù)
System.out.println(new Md5Hash("123456","zhangbo",3).toString());


可以看到使用加密過(guò)的密碼是可以登陸成功的,但使用原始密碼是無(wú)法登陸成功的,可以在具體的業(yè)務(wù)邏輯層中添加用戶時(shí)將密碼進(jìn)行加密處理。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring-boot oauth2使用RestTemplate進(jìn)行后臺(tái)自動(dòng)登錄的實(shí)現(xiàn)
這篇文章主要介紹了Spring-boot oauth2使用RestTemplate進(jìn)行后臺(tái)自動(dòng)登錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
詳解 Java Maximum redirects (100) exceeded
這篇文章主要介紹了詳解 Java Maximum redirects (100) exceeded的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟
我們的微服務(wù)項(xiàng)目用的是springCloud,某個(gè)微服務(wù)接口因?yàn)閿?shù)據(jù)處理量大,出現(xiàn)了接口超時(shí)的情況,我們需要單獨(dú)修改這一個(gè)feignClient的超時(shí)時(shí)間,所以本文介紹了SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟,需要的朋友可以參考下2023-10-10
java new一個(gè)對(duì)象的過(guò)程實(shí)例解析
這篇文章主要介紹了java new一個(gè)對(duì)象的過(guò)程實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用
這篇文章主要介紹了spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Scheduler定時(shí)任務(wù)調(diào)度詳解
文章介紹了SysJobServiceImpl類中定時(shí)任務(wù)調(diào)度的相關(guān)方法,包括清除、檢查存在性、創(chuàng)建、暫停、恢復(fù)、刪除任務(wù),以及觸發(fā)任務(wù),并提到了JobKey、CronUtils、ScheduleUtils、SpringUtils等工具類的使用,適用于Spring管理環(huán)境2025-01-01
JDBC實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了JDBC實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
springboot 使用zookeeper實(shí)現(xiàn)分布式隊(duì)列的基本步驟
這篇文章主要介紹了springboot 使用zookeeper實(shí)現(xiàn)分布式隊(duì)列,通過(guò)ZooKeeper的協(xié)調(diào)和同步機(jī)制,多個(gè)應(yīng)用程序可以共享一個(gè)隊(duì)列,并按照先進(jìn)先出的順序處理隊(duì)列中的消息,需要的朋友可以參考下2023-08-08

